2009-02-26 54 views
5

在我的控制,我有以下几点:Html.DropDownList在ASP.NET MVC RC(刷新)没有预先选择项目

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

并在视图我有:

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

呈现的下拉列表应该具有预先选择的currentItem.Id的Id的项目,但它不包含。没有选择,所以它默认为第一个。

在我更新到RC/RC(刷新)之前,这工作。有任何想法吗?

+0

这仍然是我与MVC 1.0面临的问题 – 2009-06-11 02:48:15

回答

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中”)

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

的DropDownList( “myItem” ,(SelectList)ViewData [“myList”]) DropDown

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) 

因此,在这一天结束的时候,这两个路径之间的区别在于工作方式通过真正到SelectInternal的usedViewData参数,而不能上班的路上经过

这很可能,我认为有一个bug某处内SelectInternal时usedViewData

0

对我来说(使用MVC RC刷新)

在视图中的以下工作:

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

因此,对于你的例子,很可能是:

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

嗨凯,会不会使名称和ID“ID”?这将是错误的,因为我需要名称和id是'myItem',因为这是表单提交正在寻找的id。 – 2009-02-26 13:00:40

+0

你试过了吗?检查呈现的HTML。 我的理解是,在您的控制器中,您将值字段定义为项目模型的ID,并将名称定义为SelectListItem的值。 因此,通过将下拉菜单中的第一个参数设置为Id,您可以请求此值字段。 – 2009-02-26 16:10:04

0

我只是做了我自己的下拉帮手。也许不如内置的效率高,但确实有效。

相关问题