ASP.NET MVC RC中的Html.DropDownList无法预选项目

5
在我的控制器中,我有以下代码:
ViewData["myList"] = 
   new SelectList(itemRepository.GetAll(), "Id", "Name", currentItem.Id);

我所看到的是:

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

渲染的下拉列表应该有与当前项Id相同的项目被预选中,但实际上并没有。因此,没有选中任何内容,导致默认选择第一项。
在我更新至RC/RC(refresh)之前,这个功能是正常的。你有什么想法吗?

我仍然面临着使用MVC 1.0时的问题。 - Andrew Harry
3个回答

6

如果将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")


(注:本文中保留了HTML标签)
DropDownList( string name ) ->
SelectInternal( null, name, htmlHelper.GetSelectData(name), true, false, null )

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

该代码是一个下拉列表,其中“myItem”是下拉列表的名称,“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 参数中,而无效的方法则传递 false

我认为当 usedViewDatafalse 时,SelectInternal 内部可能存在 bug。


接受此答案,因为它有效。但是@Haacked也希望能看到它。 - Iain Holder
@Troy 顺便说一下 - 我应该明确表示,多个问号不是针对你而是针对MVC霸主的。 - Iain Holder

0
以下代码适用于我(使用MVC RC Refresh)

在视图中:

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

所以针对您的示例,可能是这样的:

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

嗨Kay,那样会把名称和ID都变成“Id”吗?这是错误的,因为我需要名称和ID为“myItem”,因为这是表单提交所寻找的ID。 - Iain Holder
你试过了吗?同时检查渲染的HTML。 我的理解是,在你的控制器中,你定义value字段为你的item model的ID,而name字段为SelectListItem的值。 因此,通过将下拉列表的第一个参数设置为Id,你请求这个value字段。 - kay.herzam
是的,我试过了。第一个参数始终是呈现下拉列表的名称。对你来说不是这样吗? - Iain Holder

0

我只是自己制作了一个下拉助手。也许不像内置的那么高效,但它确实可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接