【问题标题】:DropDownListFor not binding valueDropDownListFor 不绑定值
【发布时间】:2017-05-05 17:59:14
【问题描述】:

我有以下 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,但在最终标记中并未选择它。

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

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5


    【解决方案1】:

    这个会让你想把头穿过一堵墙。您是否碰巧使用ViewBag.Title 在您的视图中设置页面标题?这很常见。

    嗯,首先你需要了解的是,在 MVC 中设置 SelectListItemSelected 属性确实jack all。 Razor 会根据 ModelState 自动选择要标记为选中的项目,并将覆盖您手动设置为选中的任何项目。

    ModelState 由来自 RequestViewData/ViewBagfinally Model 的值组成。总而言之,如果您在 Request 中有一个键,或者对您的问题很重要,一个与您的属性同名的 ViewBag 成员,那个值将是生成 HTML Razor。我想ViewBag.Title 与您的Titles 枚举中的任何内容都不匹配,所以这就是它未设置的原因。您需要将此属性命名为其他名称或将您的 ViewBag.Title 更改为 ViewBag.PageTitle 之类的名称。

    【讨论】:

    • 大声笑我自己已经为此堕落了很多次!我现在在命名模型属性“标题”时非常谨慎。这是一个烦人的小陷阱。有一次我通过将ViewBag.Title 设置在页面视图的最底部而不是顶部来解决它,并且效果很好。
    • 哈哈当然是这样的,我一定是盯着屏幕看了一个多小时,我真的不认为我会得到那个,我会改变财产名称中的盲目尝试解决问题并继续前进!非常感谢,克里斯欢呼
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多