2012-03-08 7 views
10

Estoy intentando escribir una extensión de DropDownListFor:Cómo agregar htmlAttributes adicionales en la extensión de DropDownListFor

public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool enabled) 
{ 
    return htmlHelper.DropDownListFor(expression, selectList, null /* optionLabel */, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); 
} 

Lo que queremos lograr es si está habilitado es falso no cambia, pero si está habilitado es cierto que quiero agregue @disabled="disabled" a los atributos html antes de darlos a AnonymousObjectToHtmlAttributes.

¿Alguna idea sobre cómo hacer esto?

Respuesta

30

¡Simple! HtmlHelper.AnonymousObjectToHtmlAttributes devuelve RouteValueDictionary. Puede agregar valor a ese diccionario, no necesita agregar propiedad a un objeto anónimo.

public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool enabled) 
{ 
    var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
    if (!enabled) 
    { 
     attrs.Add("disabled", "disabled"); 
    } 
    return htmlHelper.DropDownListFor(expression, selectList, null /* optionLabel */, attrs); 
} 
+3

No es necesario escribir un ayudante, sólo tiene que utilizar la sobrecarga que acepta htmlAttributes como sugiere Dmitry. – RickAndMSFT

+2

@ Rick.Anderson-at-Microsoft.com No estaría de acuerdo. Primero, la pregunta era sobre agregar atributos, no la posibilidad de usar otros métodos. Y segundo, crear ayuda en este caso es mucho más legible y luego verificar la condición habilitada y luego llamar a la sobrecarga de método correcto desde la vista – archil

2

Solución de archil works. Sin embargo, para lo que estás tratando de hacer, escribir una extensión es una exageración.

acaba de escribir en su opinión, algo así como:

@Html.DropDownListFor(m => m.Id, Model.Values, new { disabled = "disabled" }) 
+0

Sí, eso funciona pero es un poco más complejo porque no siempre está deshabilitado, depende de una propiedad. No estoy seguro de cómo lo escribiría como lo hizo anteriormente para ningún atributo si habilitado es igual a verdadero, pero está deshabilitado = "deshabilitado" para habilitado igual a falso – AnonyMouse

+2

Sí, las especificaciones html para el atributo de deshabilitación (igual que para readonly) es un desastre. Legalmente solo pueden tomar el nombre del atributo en sí. Sin embargo, a la mayoría de los navegadores se les enseña a aceptar cualquier cosa para estos atributos, por lo que disabled = "false" también resultará para usted en un atributo deshabilitado. Puede envolver todo el DropDownListFor en la declaración if con su control de propiedad como condición. Sin embargo, veo cómo sería un poco menos código con la extensión. – Dmitry

Cuestiones relacionadas