未为ASP.NET核心CSHTML视图中的DropDownListFor加载当前值



我在屏幕上有一个字段,我想限制可选择的值,所以我使用助手从字典对象构建的下拉列表来只显示有效的选项。

当第一次从数据库加载并显示选项时,代码不会被翻译——相反,它会提示"No option",这是第一个选项,而不是记录上的选项。

一旦我从下拉列表中选择了一个有效的选项,它就可以正常工作。该新值在更新时写入数据库。我只是无法在初始加载/显示时转换现有值。我想我在控制器中缺少了一些东西,无法将其设置为当前值?

字典:

public static class Options
{
public const string NoOption = "*NONE";
public const string OptionOne = "OP1";
public const string OptionTwo = "OP2";
public const string OptionThree = "OP3";
public const string OptionFour = "OP4";
public static IReadOnlyDictionary<string, string> Values =>
new Dictionary<string, string>
{
{ "No Option", NoOption },
{ "Option One", OptionOne },
{ "Option Two", OptionTwo },
{ "Option Three", OptionThree },
{ "Option Four", OptionFour }
};
}

型号:

public string Option { get; set; }
public IEnumerable<SelectListItem> OptionItems => Options.Values.ToSelectListItem();

助手扩展:

public static IEnumerable<SelectListItem> ToSelectListItem(
this IReadOnlyList<string> values) =>
from value in values
select new SelectListItem
{
Text = value.ToString(),
Value = value.ToString()
};

视图:

<div>
@Html.DropDownListFor(model => model.SelectedItem.Option, Model.SelectedItem.OptionItems, new { @id = "optionSelection" })
</div>

控制器:

public IActionResult OnGet()
{
selectedItem = itemData.GetItem(SearchTerm);
if (SelectedItem == null)
{
return RedirectToPage("./NotFound");
}
return Page();
}

您必须将字典转换为列表

var model= new Model{
OptionItems = new List<SelectListItem>();
}
foreach(var item in Options.Values) {
model.OptionItems.Add(new SelectListItem {Value= item.Key, Text = item.Value});
}

查看

<div>
@Html.DropDownListFor(model => model.SelectedItem.Option, 
new SelectList(Model.SelectedItem.OptionItems), new { @id = "optionSelection" })
</div>

或者更好地制作这样的模型

public string Option { get; set; }
public SelectList OptionItems

并将所有代码移动到

最新更新