2009-12-01 66 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