在Razor中设置enum下拉列表的默认值

本文关键字:下拉列表 默认值 enum 设置 Razor | 更新日期: 2023-09-27 18:05:34

我试图创建一个项目编辑屏幕,用户可以设置项目的属性,ItemType。理想情况下,当用户返回到屏幕时,下拉菜单将显示已经与Item关联的ItemType。

就是这样,不管项目是什么。ItemType是,下拉菜单中不会反映它。有办法解决这个问题吗?

作为参考,我现在的代码是:

<div class="form-group">
      @Html.LabelFor(model => model.ItemType, new { @class = "control-label col-xs-4" })
      <div class="col-xs-8">
           @Html.DropDownListFor(model => model.ItemType, (SelectList)ViewBag.ItemType, new { @class = "form-control" })
           @Html.ValidationMessageFor(model => model.ItemType, String.Empty, new { @class = "text-danger" })
       </div>
</div>

ViewBag的设置如下:

var ItemType = Enum.GetValues(typeof(ItemType));
ViewBag.ItemType = new SelectList(ItemType);

在Razor中设置enum下拉列表的默认值

如果你使用的是ASP。. NET MVC 5,尝试只使用EnumHelper.GetSelectList方法。那么你就不需要ViewBag.ItemType了。

@Html.DropDownListFor(model => model.ItemType, EnumHelper.GetSelectList(typeof(ItemType)), new { @class = "form-control" })

如果没有,您可能需要指定选择列表的数据值和数据文本字段。

var itemTypes = (from ItemType i in Enum.GetValues(typeof(ItemType))
                 select new SelectListItem { Text = i.ToString(), Value = i.ToString() }).ToList();
ViewBag.ItemType = itemTypes;

那么因为是IEnumerable<SelectListItem>,你需要改变你的演员。

@Html.DropDownListFor(model => model.ItemType, (IEnumerable<SelectListItem>)ViewBag.ItemType, new { @class = "form-control" })

最后我找到了一个修复方法——手动创建列表。

<select class="form-control valid" data-val="true" 
    data-val-required="The Item Type field is required." id="ItemType" name="ItemType" 
    aria-required="true" aria-invalid="false" aria-describedby="ItemType-error">
           @foreach(var item in (IEnumerable<SelectListItem>)ViewBag.ItemType)
           {
                <option value="@item.Value" @(item.Selected ? "selected" : "")>@item.Text</option>
           }
 </select>

尽量保持尽可能多的逻辑在视图和控制器之外。

我在你自己的回答中看到,看起来你从控制器中选择了一个enum。

我有一个下拉列表在我的一个应用程序,其中包含枚举列表。它还选择了一个默认值,但也为用户提供了特定的枚举。默认选项可在控制器内设置。

这个例子是基于我的需求,所以你需要适应你的情况。

在控制器中:

public ActionResult Index()
{
    ViewBag.NominationStatuses = GetStatusSelectListForProcessView(status)
}
private SelectList GetStatusSelectListForProcessView(string status)
{
    var statuses = new List<NominationStatus>(); //NominationStatus is Enum
    statuses.Add(NominationStatus.NotQualified);
    statuses.Add(NominationStatus.Sanitized);
    statuses.Add(NominationStatus.Eligible);
    statuses.Add(NominationStatus.Awarded);
    var statusesSelectList = statuses
           .Select(s => new SelectListItem
           {
               Value = s.ToString(),
               Text = s.ToString()
           });
    return new SelectList(statusesSelectList, "Value", "Text", status);
}

在视图中:

@Html.DropDownList("Status", (SelectList)ViewBag.NominationStatuses)

此方法将自动将默认项设置为控制器中选择的enum。