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

时间:2011-03-18 01:14:21

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

2 个答案:

答案 0 :(得分:21)

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

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

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

答案 1 :(得分:12)

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

这是工作代码。

<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>