使用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; }
}
Run Code Online (Sandbox Code Playgroud)
并在视图内:
@Html.DropDownListFor(model => model.Language,
new SelectList(ViewBag.AllPossibleLanguages,
"Code", "DisplayName", Model.Language.Code))
Run Code Online (Sandbox Code Playgroud)
有一些解决方法,例如使用
@Html.DropDownList("LanguageCode",
new SelectList(ViewBag.PossibleLanguages,
"Code", "DisplayName", Model.Language.Code))
Run Code Online (Sandbox Code Playgroud)
而且奇怪的是,如果第一个参数设置为"语言",则上述代码将不起作用,与模型中属性的名称相同.
我也可以这样做
@Html.DropDownListFor(model => model.Language,
new SelectList(ViewBag.AllPossibleLanguages))
Run Code Online (Sandbox Code Playgroud)
它将与适当的选定值一起工作,但是只会显示Language类的ToString()值,并且不会设置我想要的选项标签中的实际语言代码,这并不奇怪,因为它有没有任何标识可以将Code字段用作value属性.
我也可以使用jquery事件处理程序来解决这个问题,该事件处理程序之后会选择适当的值.但是我很好奇为什么这不能按预期工作,并且如果可能的话想要正确地解决它.
第一个参数@Html.DropDownListFor是模型的属性,所选值将在 Post 上绑定到。当您说@Html.DropDownListFor(model => model.Language)默认绑定器无法确定您的语言类中的哪个属性需要绑定所选值时,在下拉列表的情况下,该值始终是单个字符串或整数。出于同样的原因,@Html.DropDownList("LanguageCode")有效。
如果您想更改行为,您始终可以扩展默认模型绑定器。
编辑:
您可以尝试一下,我相信这应该可以解决您在这种情况下的问题。
@Html.DropDownListFor(model.Language.Code, new SelectList(ViewBag.AllPossibleLanguages))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15853 次 |
| 最近记录: |