Html.DropDownListFor() - 如何为强类型视图设置默认选定值?

Can*_*cer 5 c# asp.net-mvc-3

使用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事件处理程序来解决这个问题,该事件处理程序之后会选择适当的值.但是我很好奇为什么这不能按预期工作,并且如果可能的话想要正确地解决它.

sar*_*esh 4

第一个参数@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)