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

标签 c# asp.net-mvc-3

使用 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/

相关文章:

c# - 即使提供了显式值,HtmlHelper.TextBox 也会使用模型值

c# - 在没有 Flash 的情况下将实时音频流式传输到网站

c# - c#中的字符串 vector

C#在拖动操作期间检测桌面文件夹鼠标?

c# - 从基于 JSON/PHP (base64_encode) 的图像中解释 C# 中的 base 64

c# - ASP.NET Core Razor - 全局异常处理程序

c# - LINQ 中的对象引用错误

c# - 在 C# 中为泛型类型扩展返回 null

c# - 为什么 mvccontrib 的 AssertViewRendered().ForView ("Edit") 由于 View 名称是完整的 cshtml 路径而失败?

javascript - 如果 JavaScript 被禁用,如何隐藏按钮?