【问题标题】:Html.DropDownList in ASP.NET MVC RC (refresh) not pre-selecting itemASP.NET MVC RC(刷新)中的 Html.DropDownList 未预选项目
【发布时间】:2009-02-26 10:16:28
【问题描述】:

在我的控制器中,我有以下内容:

ViewData["myList"] = 
   new SelectList(itemRepository.GetAll(), "Id", "Name", currentItem.Id);

在我看来:

<%= Html.DropDownList("myItem", (SelectList)ViewData["myList"])%>

呈现的下拉列表应该预先选择 ID 为 currentItem.Id 的项目,但事实并非如此。未选择任何内容,因此默认为第一个。

这在我更新到 RC/RC(刷新)之前有效。有什么想法吗?

【问题讨论】:

  • 这仍然是我在使用 MVC 1.0 时面临的问题

标签: c# .net asp.net-mvc


【解决方案1】:

如果您将 ViewData 中键的名称与视图上的表单字段名称相匹配,则 HtmlHelpers 旨在根据该键从 ViewData 中隐式提取。我建议将您的视图代码更改为:

<%= Html.DropDownList("myList") %>

以这种方式使用 HtmlHelpers 似乎效果最好(尽管这并不总是可行的)。

更新:

为了详细说明这似乎有效而其他方法无效的原因,我深入研究了 SelectExtensions.cs 的代码...

无论您如何调用 DropDownList,私有方法 SelectInternal 最终都会呈现实际的 HTML。 SelectInternal 的签名如下:

SelectInternal( string optionLabel, string name, IEnumerable<SelectListItem> selectList, bool usedViewData, bool allowMultiple, IDictionary<string,object> htmlAttributes )

这里是 DropDownList 的两种用法的路径:

DropDownList("myList")

DropDownList( string name ) ->
SelectInternal( null, name, htmlHelper.GetSelectData(name), true, false, null )

DropDownList("myItem",(SelectList)ViewData["myList"]) 下拉

List( string name, IEnumerable<SelectListItem> selectList ) ->
DropDownList( name, selectList, null /* object, htmlAttributes */ ) ->
DropDownList( name, selectList, new RouteValueDictionary(htmlAttributes) ) ->
SelectInternal( null, name, selectList, false, false, htmlAttributes )

因此,归根结底,这两种路径之间的区别在于,有效的方式将 true 传递给 SelectInternal 的 usedViewData 参数,而无效的方式' t 工作通过 false.

在我看来,当 usedViewDatafalse 时,SelectInternal 内部某处可能存在错误。

【讨论】:

  • 接受这个有效的答案。但@Haacked 希望也能看到它。
  • @Troy btw - 我应该清楚的是,多个问号并不是 MVC 霸主针对你的。
【解决方案2】:

以下对我有用(使用 MVC RC 刷新)

在视图中:

<%= Html.DropDownList("NAME_OF_ITEM_ID_PROPERTY", (SelectList)ViewData["myList"]) %>

所以你的例子可能是:

<%= Html.DropDownList("Id", (SelectList)ViewData["myList"]) %>

【讨论】:

  • 嗨,凯,这不会使名称和 id 变成“Id”吗?那是错误的,因为我需要名称和 id 为“myItem”,因为那是表单提交正在寻找的 id。
  • 你试过了吗?还要检查呈现的 HTML。我理解它的方式,在您的控制器中,您将值字段定义为项目模型的 ID,并将名称定义为 SelectListItem 的值。因此,通过将下拉列表中的第一个参数设置为 Id,您需要此值字段。
  • 是的,我试过了。第一个参数始终是渲染下拉列表的名称。不是给你的吗?
【解决方案3】:

我只是制作了自己的下拉助手。可能不如内置的效率高,但它确实有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多