2009-12-01 25 views
25

estoy usando ASP.NET MVC, y estoy tratando de hacer una lista de selección con el método HtmlHelper.DropDownListFor, así:ASP.NET MVC: poner atributos personalizados en la etiqueta de opción en la lista de selección

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

donde SelectListHelper simplemente devuelve un IList<SelectListItem> de cualquier colección que estamos pasando. Esto funciona muy bien para las cosas simples, pero yo quiero ser capaz de añadir un atributo title para cada opción etiqueta (no la seleccione propia lista) Pero DropDownListFor solo admite IEnumerable<SelectListItem>, y SelectListItem no tiene ningún lugar que pueda poner en el atributo de título.

¿Hay alguna manera de hacer esto sin renunciar al método DropDownListFor y escribir la lista de selección y cada elemento a mano?

Respuesta

2

Si examina el código fuente de MVC, DropDownListFor utiliza DropDownList, que utiliza SelectInternal, que utiliza ListItemToOption, que envuelve a las llamadas TagBuilder. Podría modificar e incluir esta fuente para aceptar llamadas adicionales a TagBuilder cuando se construya la etiqueta de opción real.

+1

Sí, esto es lo que terminé haciendo ... básicamente arrancando un montón de código de .NET Reflector. Parece que funciona, pero me pone un poco nervioso debido a todas las otras porquerías que parecen estar haciendo estos métodos, que pueden ser un poco difíciles de descifrar. Supongo que lo arreglaremos como va. – amkessel

+2

No es necesario usar Reflector; el código para ASP.NET MVC está a disposición del público: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471 –

4

DropDownList y derivados no son compatibles con la funcionalidad que está buscando. Pero también podría simplemente procesar la cadena devuelta por 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

Este ** sería ** el más fácil, pero el problema surge cuando necesito otro valor para el atributo de título para cada opción. Entonces se convierte en una pesadilla de manipulación de cuerdas. – amkessel

Cuestiones relacionadas