在ASP.NET MVC 4.0下拉列表中选择的值

selectlist html.dropdownlistfor asp.net-mvc-4

15519 观看

2回复

4849 作者的声誉

我正在尝试使用DropdownListFor功能创建一个下拉列表,我想在其中选择一个值。

我进行了很多搜索,发现了在中包含SelectList对象的类似解决方案ViewModel,我尝试了类似的方法

在我的ViewModel我用类型的属性SelectList是这样

SelectList HoursToSelect = new SelectList(MyDictionaryObject, "Value", "Key", 14/*selected value*/);

我像这样使用它

@Html.DropDownListFor(m => m.EndsOnHour, HoursToSelect)

这一切都很好,完全满足了我的要求

但是问题是由于项目的体系结构,我无法SelectList在对象中使用对象,ViewModel因为我的项目不允许在中使用不可序列化的类ViewModel

因此,剩下的唯一方法就是在“视图”中包含某些内容

 @Html.DropDownListFor(m => m.EndsOnHour, new SelectList(Model.Hours, "Value", "Key"))

但是不知道是什么!有人有想法实现这一目标吗?

作者: Pawan Nogariya 的来源 发布者: 2012 年 1 月 19 日

回应 (2)


4

14944 作者的声誉

决定

@Html.DropDownListFor(...)与对象的属性一起使用时,它将使用对象的当前状态来设置所选项目。因此,在您的示例中,如果未在选择列表中指定值,则它将使用的值m.EndsOnHour来设置所选值。实际上,选择列表甚至不必SelectList说每句话,它实际上只需要是的集合,SelectListItem就可以在文档中看到。

但是,您的序列化问题仍然存在。这里有几个选项,如果可能的话,最简单的方法就是将值放在视图侧。许多下拉列表是为静态选择而构建的,以显示枚举的可能选择,例如列出州或国家。其他常见示例包括日期范围等。在这些情况下,您可以编写将生成这些列表并在视图中调用它们的助手,然后将其从视图模型中删除。

但是,如果列表是动态的,那么从长远来看,它将无法很好地工作,并且可能会导致额外的耦合,从而对系统的维护产生负面影响。在这种情况下,您将需要创建自己的SelectList可序列化的子类,然后将其用作的可序列化实现的通用类型参数IEnumerable<T>。C#中的数组是可序列化的,因此您已经做好了这部分的工作。

作者: Nick Larsen 发布者: 20.01.2012 01:36

3

1176 作者的声誉

我个人放弃了DropDownListFor,只是做了这样的事情。不知道是否有任何理由为什么这不是一个好主意。

<select id="details-title">
@foreach (var title in Helper.Titles)
{
<option value="@title.Value" @(title.Value==Model.SelectedTitle?"selected=\"selected\" ":"")>@title.Text</option>
}
</select>
作者: Paul Johnson 发布者: 04.04.2012 04:34
32x32