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

C# Html.DropDownListFor()-如何设置强类型视图的默认选定值?,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,使用ASP.NET MVC 3,我一直在为强类型视图使用help Html.DropDownListFor()函数设置下拉列表的选定值 模型的代码如下所示: public class ResourceView { ... public Language Language { get; set; } } public class Language { public string DisplayName { get; private set; } public

使用ASP.NET MVC 3,我一直在为强类型视图使用help 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))
奇怪的是,如果将第一个参数设置为“Language”(与模型中属性的名称相同),则上面的代码将不起作用

我也可以这样做

@Html.DropDownListFor(model => model.Language, 
  new SelectList(ViewBag.AllPossibleLanguages))
这也适用于适当的选定值,但是只会显示Language类的ToString()值,并且不会设置我希望在选项标记中使用的实际语言代码,这并不奇怪,因为没有任何标识代码字段应用作值属性


我还可以使用jquery事件处理程序来解决这个问题,该处理程序随后选择适当的值。然而,我很好奇为什么这不能像预期的那样工作,如果可能的话,我想正确地解决它。

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

如果要更改行为,始终可以扩展默认模型绑定器

编辑:

你可以试试,我相信这会解决你的问题

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

这似乎有效:@Html.DropDownListFor(model=>model.Language.Code,new SelectList(ViewBag.possiblellanguages,“Code”,“DisplayName”))我认为只可能绑定到模型的直接属性,而不可能绑定到其关系的属性。但是仍然存在一个问题,它似乎自动创建一个名为“Language.Code”的表单参数名,我不知道如何在控制器中用“.”绑定表单参数。通过将语言作为参数解决了上述问题。显然,模型绑定器将处理参数name.TL内的时段;DR:这是
new SelectList(items,dataValueField,dataTextField,selectedValue)中的第四个参数