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

Current Value not loaded for DropDownListFor in ASP.NET Core CSHTML View

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

首次从数据库加载并显示选项时,代码未翻译 - 而是提示 'No Option',第一个选项,而不是记录中的选项。

一旦我 select 从下拉列表中选择一个有效选项,它就可以正常工作。该新值在更新时写入数据库。 我只是无法在初始 load/display 上获取要翻译的现有值。我想我在控制器中遗漏了一些东西来将它设置为当前值?

词典:

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

并将所有代码移至此处