DropDownListFor没有绑定值

时间:2017-05-05 17:59:14

标签: 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; }
...

在控制器中调用:

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

  return View(ctc);

然后在视图中:

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

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

[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;
            }
        }
    }
}

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

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

1 个答案:

答案 0 :(得分:6)

这会让你想要把头伸到墙上。您是否恰巧使用ViewBag.Title在视图中设置页面标题?这很常见。

嗯,首先需要了解的是,设置Selected的{​​{1}}属性会在MVC中执行绝对 jack all 。剃刀会根据SelectListItem自动选择要标记为选中的项目,并覆盖您手动设置为所选内容的任何内容。

ModelStateModelStateRequest / ViewData最终 ViewBag的值组成。无论长短,如果您在Model中有密钥,或者对您的问题很重要,Request成员与您的财产同名,那么 值将是为生成的HTML Razor设置值。我想象ViewBagViewBag.Title枚举中的任何内容都不匹配,这就是为什么它未被设置。您需要将此属性命名为其他内容,或将Titles更改为ViewBag.Title之类的内容。