使用ASP.NET MVC 3,我一直在努力为强类型视图使用帮助Html.DropDownListFor()函数设置下拉列表的选定值。
模型的代码如下所示:
public class ResourceView
{
...
public Language Language { get; set; }
}
public class Language
{
public string DisplayName { get; private set; }
public string Code { get; private set; }
public override string ToString() { return DisplayName; }
}
并在视图中:
@Html.DropDownListFor(model => model.Language,
new SelectList(ViewBag.AllPossibleLanguages,
"Code", "DisplayName", Model.Language.Code))
有一些解决方法,例如使用
@Html.DropDownList("LanguageCode",
new SelectList(ViewBag.PossibleLanguages,
"Code", "DisplayName", Model.Language.Code))
并且奇怪的是,如果第一个参数设置为“语言”,上面的代码将不会,与模型中属性的名称相同。
我也可以这样做
@Html.DropDownListFor(model => model.Language,
new SelectList(ViewBag.AllPossibleLanguages))
也可以使用适当的选定值,但是只会显示Language类的ToString()值,并且不会设置我想要的选项标签中的实际语言代码,这并不奇怪因为没有任何标识可以将Code字段用作值属性。
我也可以使用jquery事件处理程序解决这个问题,该处理程序之后会选择适当的值。但是我很好奇为什么这不能按预期工作,并且如果可能的话,我希望能够妥善解决。
答案 0 :(得分:4)
@Html.DropDownListFor
的第一个参数是所选值将在Post上绑定到的模型的属性。当您说@Html.DropDownListFor(model => model.Language)
时,默认绑定器将无法确定您的语言类中的哪个属性需要绑定所选值,在下拉列表的情况下,它将始终是单个字符串或整数。出于同样的原因@Html.DropDownList("LanguageCode")
有效。
如果您想更改行为,可以随时扩展默认模型绑定器。
修改强>
您可以尝试,我认为在这种情况下我应该解决您的问题。
@Html.DropDownListFor(model.Language.Code, new SelectList(ViewBag.AllPossibleLanguages))