【问题标题】:MVC DropDownListFor() Selected Item is not Selected / Required Validation not runMVC DropDownListFor() 所选项目未选中/未运行所需验证
【发布时间】:2011-03-18 01:14:21
【问题描述】:

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

模型中的字段只是用户名(先生、小姐等)的标题字符串。下面是我到目前为止的代码。

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

【问题讨论】:

  • 您是否尝试使用 var list = new SelectList(...) ?因为这样的东西对我有用: Html.DropDownListFor(m=> m.Title, new SelectList(new string[] { "Select title", "Mr", "Miss"}, "Mr")); (选择先生)
  • 您可以使用调试器确认其中一项的 Selected 设置为 true 吗?

标签: asp.net-mvc-3


【解决方案1】:

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

原因是在 MVC 2/3 中,任何 ViewBag / ViewData 属性与 Model 对象中的属性同名都会在 @ 中优先使用 987654322@,因此您需要重命名它们以确保它们不会冲突。因为这看起来很不稳定,所以我完全停止使用 ViewBag,现在只依赖 View Model 将内容传递到 View。

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

【讨论】:

  • 老兄,你真棒。这完美地解决了我的问题。非常感谢!
  • 我认为这是 MVC3 中的一个错误。 ViewData 键中具有相同模型属性名称的任何内容都会导致此问题。谢谢你拯救了我的一天 +1
  • 谢谢!我几乎浪费了这么多时间。
  • 非常感谢,我快疯了!
  • 这个答案应该被接受。这非常有帮助,你是救生员! +1
【解决方案2】:

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

这是工作代码。

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

【讨论】:

  • 这是因为您可能已经在 ViewBag / ViewData 中使用了一个名为 Title 的属性。我建议更改您的 ViewBag / ViewData 属性名称,而不是您的模型属性名称。事实上,完全停止使用 ViewBag / ViewData 因为这太可怕了:)
  • 非常感谢,我遇到了同样的问题,我快疯了!
  • @JamesMcCormack “可怕的”这个词真是太棒了。我们应该如何将不属于强类型模型的其他数据发送到我们的视图?
  • @iGanja 创建一个包含视图所需的所有内容的类。这个概念被称为 ViewModel。
  • @iGanja 这太可怕了,因为它的类型很松散。你不必走太远就能找到很多关于强类型的好处的文章。 “有没有将我的视图与我的模型分离的整个概念?”实际上,使用 ViewModel 通过使您的视图不依赖于您的模型来改善解耦。例如,我经常有一个 ViewModel 供 Create 和 Edit 页面使用。如果 Model 发生变化,我只需要更改到 ViewModel 的映射即可。无论如何,我不必更改视图。如果你直接在你的视图中使用你的模型类,那么你就有了紧密的耦合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多