4

我正在尝试使用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"))

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

4

2 回答 2

4

当您使用@Html.DropDownListFor(...)对象的属性时,它将使用对象的当前状态来设置选定项。因此,在您的示例中,如果您未在选择列表中指定值,它将使用 的值m.EndsOnHour来设置所选值。实际上,选择列表甚至不必是SelectList每个人的说法,它实际上只需要是SelectListItems 的集合,正如您在文档中看到的那样。

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

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

于 2012-01-20T01:36:35.117 回答
3

就我个人而言,我放弃了 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>
于 2012-04-04T16:34:52.230 回答