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

时间:2011-04-09 21:00:53

标签: 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;  }
}

并在视图中:

@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事件处理程序解决这个问题,该处理程序之后会选择适当的值。但是我很好奇为什么这不能按预期工作,并且如果可能的话,我希望能够妥善解决。

1 个答案:

答案 0 :(得分:4)

@Html.DropDownListFor的第一个参数是所选值将在Post上绑定到的模型的属性。当您说@Html.DropDownListFor(model => model.Language)时,默认绑定器将无法确定您的语言类中的哪个属性需要绑定所选值,在下拉列表的情况下,它将始终是单个字符串或整数。出于同样的原因@Html.DropDownList("LanguageCode")有效。

如果您想更改行为,可以随时扩展默认模型绑定器。

修改

您可以尝试,我认为在这种情况下我应该解决您的问题。

@Html.DropDownListFor(model.Language.Code, new SelectList(ViewBag.AllPossibleLanguages))