DropDownListFor没有绑定值

SWa*_*SWa 0 asp.net-mvc asp.net-mvc-5

我有以下ViewModel

    public class ContactAddViewModel
    {
        string _title;
        public ContactAddViewModel()
        {
            var titles = new List<SelectListItem>()
            {
                new SelectListItem() { Value = "Mr", Text= "Mr" },
                new SelectListItem() { Value= "Miss", Text="Miss" },
                new SelectListItem() { Value = "Mrs", Text= "Mrs" },
                new SelectListItem() { Value = "Ms", Text = "Ms" },
                new SelectListItem() { Value = "Dr", Text = "Dr" }
            };

            Titles = titles;
        }

        [Required]
        [Display(Name = "Title")]
        public string Title { get; set; }
        public IEnumerable<SelectListItem> Titles { get; set; }
...
Run Code Online (Sandbox Code Playgroud)

在控制器中调用:

  var ctc = new ContactAddViewModel()
            {
                Title = contact.Title.Trim()
            };

  return View(ctc);
Run Code Online (Sandbox Code Playgroud)

然后在视图中:

<div class="form-group col-md-2">
    @Html.LabelFor(m => m.Title)
    @Html.DropDownListFor(m => m.Title, Model.Titles, string.Empty, new { @class = "form-control placeholder-no-fix" })
    @Html.ValidationMessageFor(m => m.Title, "", new { @class = "help-block" })
</div>
Run Code Online (Sandbox Code Playgroud)

但是没有选择任何选项.我已经确认标题是正确的,我甚至尝试过手动设置:

[Required]
[Display(Name = "Title")]
public string Title
{
    get { return _title; }
    set
    {
        _title = value;
        foreach(var t in Titles)
        {
            if(t.Value == _title)
            {
                t.Selected = true;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在视图中进行调试时,正确SelectListItemSelected属性设置为true,但是在最终标记中未选中该属性.

我哪里错了? - 我有正确绑定的模型中的其他下拉列表(如果有任何差异,则具有数值).

Chr*_*att 6

这个会让你想要把头穿过一堵墙.您是否正好ViewBag.Title在视图中设置页面标题?这很常见.

好吧,你需要了解的第一件事是在MVC 中设置绝对插孔Selected属性.剃刀会根据您自动选择要标记为选中的项目,并覆盖您手动设置为选中的任何项目.SelectListItemModelState

ModelState从组成值Request,ViewData/ ViewBag最后 Model.长与短,如果你有一个关键Request,以您的问题,或者这里很重要,一个ViewBag具有相同的名称属性成员,值将成为生成的HTML剃刀设定值.我想像ViewBag.Title你的Titles可枚举中的任何东西都不匹配,所以这就是为什么它没有被设置.您需要将此属性命名为其他内容或将其更改ViewBag.Title为类似的内容ViewBag.PageTitle.