MVC DropDownListFor()所选项目未选中/必需验证未运行

The*_*lTy 11 asp.net-mvc-3

我无法让我的DropDownList将所选项目设置为模型中的值.

模型中的字段只是用户名称标题的字符串(Mr,Miss等..)以下是我的代码.

<td>
@{ var list = new List<SelectListItem>(new[] {                    
    new SelectListItem{ Selected = string.IsNullOrEmpty(Model.Title), Text="",Value=""},
    new SelectListItem{ Selected = Model.Title.Equals("Mr"), Text="Mr",Value="Mr"},
    new SelectListItem{ Selected = Model.Title.Equals("Mrs"),   Text="Mrs",Value="Mrs"},
    new SelectListItem{ Selected = Model.Title.Equals("Miss"), Text="Miss",Value="Miss"},
    new SelectListItem{Selected = Model.Title.Equals("Ms"), Text="Ms",Value="Ms"}       
    });
}
@Html.DropDownListFor(m=>m.Title, list)
</td>
Run Code Online (Sandbox Code Playgroud)

Jam*_*ack 21

我在MVC 3中遇到了这个问题,结果发现我在View上设置了ViewBag.Title(使用它作为页面标题).一旦我将其更改为ViewBag.PageTitle,下拉列表代码就开始工作:@Html.DropDownListFor(model => model.Title, Model.MySelectList)

原因是在MVC 2/3中,任何 Model对象中名称相同的 ViewBag/ViewData属性都会被优先使用DropDownListFor(),因此您需要重命名它们以确保它们不会发生冲突.因为这看起来非常不稳定,所以我完全停止使用ViewBag,现在只依赖于View Model将内容传递给View.

这个问题如此普遍的原因是ViewBag.Title用于许多入门教程和演示代码来设置HTML标题元素,因此不可避免地被采纳为"最佳实践"方法.但是,Title是用于"用户详细信息"视图下拉列表的自然模型属性名称.

  • 我认为这是MVC3中的一个错误.ViewData键中具有相同Model属性名称的任何内容都会导致此问题.谢谢你救了我的一天+1 (3认同)
  • 伙计,你太棒了.这完全解决了我的问题.非常感谢! (2认同)

The*_*lTy 12

事实证明,它不起作用的唯一原因是因为我的字段名称是标题,我将其更改为前缀并且我的确切代码有效.花太多时间找出来...

这是工作代码.

<td>
    @{ var list = new List<SelectListItem>(new[] {
        new SelectListItem { 
            Selected = string.IsNullOrEmpty(Model.Prefix), 
            Text="",
            Value=""
        },
        new SelectListItem { 
            Selected = Model.Prefix.Equals("Mr"), 
            Text="Mr",
            Value="Mr"
        },
        new SelectListItem {
            Selected = Model.Prefix.Equals("Mrs"),
            Text="Mrs",
            Value="Mrs"
        },
        new SelectListItem {
            Selected = Model.Prefix.Equals("Miss"), 
            Text="Miss",
            Value="Miss"
        },
        new SelectListItem {
            Selected = Model.Prefix.Equals("Ms"), 
            Text="Ms",
            Value="Ms"
        }       
      });
    }
    @Html.DropDownListFor(m => m.Prefix, list)
</td>
Run Code Online (Sandbox Code Playgroud)

  • 这是因为您可能已经在ViewBag/ViewData中使用了名为Title的属性.我建议您更改ViewBag/ViewData属性名称,而不是模型属性名称.事实上,完全停止使用ViewBag/ViewData因为它太可怕了:) (2认同)