我有一个枚举,它是属性描述与数据库中索引的映射。我的 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>
}
}