在Razor

时间:2015-07-29 15:34:28

标签: c# razor enums

我试图创建一个项目编辑屏幕,用户可以在其中设置Item的属性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>

ViewBag设置如下:

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

3 个答案:

答案 0 :(得分:2)

如果您正在使用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" })

答案 1 :(得分:1)

最终我找到了一个修复 - 手动创建列表。

CREATE FUNCTION IsNumeric (input varchar(1024)) RETURNS int
RETURN input REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';

答案 2 :(得分:1)

尝试在视图和控制器之外保留尽可能多的逻辑。

我在你自己的回答中看到,你的控制器中有一个从中选择的枚举。

我的一个应用程序中有一个DropDownList,其中包含一个Enums列表。它还具有选定的默认值,但也具有用户可用的特定枚举。可以在控制器中设置默认选择。

此示例基于我的需求,因此您需要适应您的情况。

在控制器中:

Model2

在视图中:

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

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