【问题标题】:Selected value in asp.net MVC 4.0 dropdownlistasp.net MVC 4.0 下拉列表中的选定值
【发布时间】:2012-01-19 14:36:18
【问题描述】:

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

我进行了很多搜索,发现在ViewModel 中有一个SelectList 对象的类似解决方案,我尝试过类似这样的解决方案

在我的ViewModel 中,我使用了SelectList 类型的属性,就像这样

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

我就是这样用的

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

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

但问题是由于我的项目架构,我不能在我的ViewModel 中使用SelectList 对象,因为我的项目不允许在ViewModel 中使用不可序列化的类。

所以留给我的唯一方法就是只在我的视图中有一些东西,这里有一些东西

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

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

【问题讨论】:

    标签: selectlist html.dropdownlistfor asp.net-mvc-4


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      就我个人而言,我放弃了 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>
      

      【讨论】:

      • 客户端验证已手动完成。自定义模型绑定器需要更多手动调整才能使用。没有挂钩到可能定义的 EditorTemplates。而且,更多的代码。根据定义,最后一个还不错,但是将此 foreach 循环复制粘贴到定义下拉列表的所有视图中是。 DropDownListFor 实际上是生成下拉列表的好方法,只需将其绑定到模型上的属性,一切都很好。如果由于某种原因你真的不喜欢这种方法(花五分钟以上的时间研究这个),更好的方法是创建你自己的 HTML 助手。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      相关资源
      最近更新 更多