2009-12-01 69 views
25

我使用ASP.NET MVC和我试图渲染与HtmlHelper.DropDownListFor方法的选择列表,像这样:ASP.NET MVC:将自定义属性,进入选项标签在选择列表

<%= Html.DropDownListFor(x => x.AllTopics, SelectListHelper.GetSelectListItems(Model.AllTopics), "Select a Topic", new { id = "allTopics", @class = "topic-dropdown" })%> 

其中SelectListHelper刚刚从任何收集我们传递一个IList<SelectListItem>返回。这正常工作对简单的事情,但我希望能够到一个title属性添加到每个选项标签(选择列表本身)。但DropDownListFor只需要IEnumerable<SelectListItem>,而SelectListItem没有任何可放入title属性的位置。

有没有办法做到这一点,没有前面的DropDownListFor方法和手写出选择列表和每个元素?

回答

2

望着MVC的源代码,DropDownListFor使用DropDownList,它采用SelectInternal,它采用ListItemToOption,它包装调用TagBuilder。您可以修改和包含此源以在实际选项标记生成时接受对TagBuilder的额外调用。

+1

是的,这就是我最终做的......基本上从.NET Reflector中取出一堆代码。似乎工作,但让我有点紧张,因为这些方法似乎在做的所有其他垃圾,这可能有点难以破译。我想我们只是修复它。 – amkessel 2009-12-03 17:00:27

+2

不需要使用反射器; ASP.NET MVC的代码是公开的:http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471 – 2009-12-03 21:14:07

4

DropDownList和衍生产品不支持您正在寻找的功能。但是你也可以简单地处理DropDownList返回的字符串。

<%= 
    Html.DropDownListFor(x => x.AllTopics, 
    SelectListHelper.GetSelectListItems(Model.AllTopics), 
    "Select a Topic", 
    new { id = "allTopics", @class = "topic-dropdown" }) 
    .Replace("<option", "<option attr=\"value\"") 
%> 
+9

这个**会是最简单的,但是当我需要一个不同的问题时会出现问题每个选项的title属性的值。然后它变成了字符串操作的噩梦。 – amkessel 2009-12-03 16:57:57