2009-12-01 14 views
25

sto usando ASP.NET MVC, e sto cercando di rendere un elenco di selezione con il metodo HtmlHelper.DropDownListFor, in questo modo:ASP.NET MVC: mettere attributi personalizzati in opzione etichetta nella lista di selezione

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

dove SelectListHelper solo restituisce un IList<SelectListItem> da qualunque collezione stiamo passando. Questo funziona bene per le cose semplici, ma voglio essere in grado di aggiungere un attributo title per ogni opzione tag (non il selezionare lista stessa). Ma DropDownListFor accetta solo un IEnumerable<SelectListItem> e il SelectListItem non ha alcun luogo che posso inserire nell'attributo del titolo.

C'è un modo per farlo senza rinunciare al metodo DropDownListFor e scrivere a mano l'elenco di selezione e ogni elemento?

risposta

2

Guardando il codice sorgente di MVC, DropDownListFor utilizza DropDownList, che utilizza SelectInternal, che utilizza ListItemToOption, che avvolge le chiamate a TagBuilder. È possibile modificare e includere questa fonte per accettare chiamate extra a TagBuilder quando viene creato il tag di opzione effettivo.

+1

Sì, questo è quello che ho finito facendo ... in pratica strappando un po 'di codice da .NET Reflector. Sembra funzionare, ma mi rende un po 'nervoso a causa di tutte le altre schifezze che sembrano fare questi metodi, che possono essere difficili da decifrare. Immagino che lo sistemeremo appena verrà. – amkessel

+2

Non è necessario utilizzare Reflector; il codice per ASP.NET MVC è pubblicamente disponibile: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471 –

4

DropDownList e derivati ​​non supportano la funzionalità che stai cercando. Ma potresti anche semplicemente elaborare la stringa restituita da 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

Questo ** sarebbe ** il più semplice, ma il problema sorge quando ho bisogno di un altro valore per l'attributo title per ogni opzione. Quindi diventa un incubo di manipolazione delle stringhe. – amkessel

Problemi correlati