C# 在Razor中设置枚举下拉列表的默认值

C# 在Razor中设置枚举下拉列表的默认值,c#,razor,enums,C#,Razor,Enums,我正在尝试创建一个项目编辑屏幕,用户可以在其中设置项目的属性ItemType。理想情况下,当用户返回屏幕时,下拉列表将显示已与项目关联的ItemType 事实上,无论item.ItemType是什么,下拉列表都不会在下拉列表中反映这一点。有办法解决这个问题吗 作为参考,我目前的代码是: <div class="form-group"> @Html.LabelFor(model => model.ItemType, new { @class = "control-la

我正在尝试创建一个项目编辑屏幕,用户可以在其中设置项目的属性ItemType。理想情况下,当用户返回屏幕时,下拉列表将显示已与项目关联的ItemType

事实上,无论item.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>

如果您使用的是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,你就需要改变你的演员阵容

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

如果您使用的是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,你就需要改变你的演员阵容

@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>

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

<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>

尽量保持视图外部和控制器中的逻辑

我在您的自我回答中看到,您似乎从控制器中选择了一个枚举

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

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

在控制器中:

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);
}

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

尝试将尽可能多的逻辑保留在视图外部和控制器中

我在您的自我回答中看到,您似乎从控制器中选择了一个枚举

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

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

在控制器中:

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);
}

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

如何设置ViewBag.ItemType?您是否设置了模型的ItemType属性?只要model.ItemType在SelectListItem元素中有一个匹配的值,我相信它应该可以工作;ViewBag.ItemType=新建SelectListItemType;如何设置ViewBag.ItemType?您是否设置了模型的ItemType属性?只要model.ItemType在SelectListItem元素中有一个匹配的值,我相信它应该可以工作;ViewBag.ItemType=新建SelectListItemType;