使用 ASP.NET MVC 3,我一直在努力使用帮助 Html.DropDownListFor() 函数为强类型 View 设置下拉列表的选定值。
模型的代码如下所示:
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; }
}
在 View 中:
@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))
奇怪的是,如果第一个参数设置为“Language”,与模型中属性的名称相同,上面的代码将不会工作。
我也可以这样做
@Html.DropDownListFor(model => model.Language,
new SelectList(ViewBag.AllPossibleLanguages))
这将与适当的选定值一起工作,但是只会显示 Language 类的 ToString() 值,并且不会设置我想要在选项标签中的实际语言代码,这并不奇怪因为没有任何标识应该将代码字段用作值属性。
我还可以使用 jquery 事件处理程序解决此问题,该处理程序随后会选择适当的值。但是我很好奇为什么这不能按预期工作,如果可能的话我想妥善解决它。
最佳答案
@Html.DropDownListFor
的第一个参数是模型的属性,所选值将绑定(bind)到 Post。当您说 @Html.DropDownListFor(model => model.Language)
时,默认绑定(bind)器将无法确定您的 Language 类中的哪个属性需要绑定(bind)所选值,在下拉列表的情况下列表将始终是单个字符串或整数。出于同样的原因,@Html.DropDownList("LanguageCode")
起作用。
如果您想更改行为,您始终可以扩展默认模型绑定(bind)器。
编辑:
您可以试试,我相信在这种情况下应该可以解决您的问题。
@Html.DropDownListFor(model.Language.Code, new SelectList(ViewBag.AllPossibleLanguages))
关于c# - Html.DropDownListFor() - 如何为强类型 View 设置默认选定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5607890/