0

我有一个枚举,它是属性描述与数据库中索引的映射。我的 ViewModel 上有一个属性,它代表该枚举的一个实例。我已经尝试过返回枚举实例列表,这意味着我这样做:

@Html.DropDownListFor(m => m.CurrentFilter,
                    Model.FilterTypes.Select(entry =>
                        new SelectListItem{ Text = entry.ToString(), Value = ((int)entry).ToString()}),
                    new { @class = "normalcell", style = "WIDTH: 132px;" })     

并返回一个 SelectListItems 列表,这意味着我这样做:

            @Html.DropDownListFor(m => m.CurrentFilter,
                    Model.FilterTypes.Select(entry =>
                        new SelectListItem{ Text = entry.Text, Value = entry.Value, Selected = entry.Selected}),
                    new { @class = "normalcell", style = "WIDTH: 132px;" })                         

在第二种情况下,当我调试时,我确定条目对象上的 Selected 属性对于正确的项目是正确的。在这两种情况下,我的 HTML 中都没有写入“选择”属性,因此没有选择正确的项目。我还设置了一个断点,并且 CurrentFilter 确实具有正确的值,并且我的页面的其余部分正确呈现,因此它正在查找值。

我写了很多有效的下拉列表,使用类似的代码,我无法为我的生活看到为什么这不起作用,无论我如何尝试这样做?

我也试过:

@Html.DropDownListFor(m => m.CurrentFilter,
                    Model.FilterTypes,
                    new { @class = "normalcell", style = "WIDTH: 132px;" })     

在我看来,这似乎是一种合乎逻辑的方式(返回一个 SelectListItems 列表,只是在页面中不做任何处理),但 Selected 属性仍然被忽略。

更新:

我试着这样做:

@Html.DropDownList("CurrentFilter", Model.FilterTypes, new { @class = "normalcell", style = "WIDTH: 132px;" })      

并从请求中读取值。我仍然会返回一个列表,其中只有一个具有 Selected == true 的项目,并且 MVC 仍然会忽略它。

这行得通,不足为奇,但我很想知道为什么所有其他事情都行不通。

<select class="normalcell" id="CurrentFilter" name="CurrentFilter" style="WIDTH: 132px;">
  @foreach (SelectListItem item in Model.FilterTypes)
  {
      if (item.Selected)
      {
           <option value="@item.Value" selected="selected">@item.Text</option>
      }
      else
      {
         <option value="@item.Value">@item.Text</option>
      }
   }

4

2 回答 2

0

我相信原因是 MVC 绑定引擎不知道如何处理 Enum 值。我认为您需要为您的视图模型创建一个“代理”属性。像这样的东西...

public enum MyEnum { a, b, c, d };

public MyEnum EnumVal { get; private set; }

public string EnumProxy
{
    get { return EnumVal.ToString(); }
    set { EnumVal = (MyEnum)Enum.Parse(typeof(MyEnum), value); }
}

然后使用枚举名称构造下拉列表:

Type t = typeof(MyEnum);
var ddList = Enum.GetNames(t).Select(
    item => new SelectListItem() { Text = item, Value = item }
).ToArray();

现在您应该可以正常使用DropDownListFor了:

@Html.DropDownListFor(model => model.EnumProxy, ddList)

我不确定是否有更简洁的解决方案。这个应该可以。

于 2012-06-22T06:35:38.157 回答
0

我的 DDL 教程展示了如何使用枚举。请参阅我的教程使用 DropDownList Box 和 jQuery以及我的博客教程的 ASP.Net MVC 中的级联 DropDownList 第 2 部分说明:当字符串参数(要绑定的属性)和 SelectList 对象具有相同名称时,选择的值未使用。

Darin 有一个关于未显示所选值的另一个常见原因的 SO 帖子。请参阅MVC DropDownList SelectedValue 未正确显示

于 2012-06-22T18:41:23.667 回答