Saltar al contenido

MVC 3: Adición condicional del atributo deshabilitado con HtmlHelpers

Perla, miembro de este equipo de trabajo, nos hizo el favor de redactar esta sección ya que controla perfectamente dicho tema.

Defina esto en algún lugar de su vista/ayudantes

@functions 
 object getHtmlAttributes (bool ReadOnly, string CssClass) 
 
     if (ReadOnly) 
         return new  @class = CssClass, @readonly = "readonly" ;
     
     return new  @class = CssClass ;
 

Entonces usa:

@Html.TextBox("name", "value", @getHtmlAttributes(Model.ReadOnly, "test"))

Aquí está mi respuesta de esta pregunta similar: https://stackoverflow.com/a/13922813/495000


Creé el siguiente ayudante: toma un objeto booleano y anónimo. Si está deshabilitado trueagrega los discapacitados attribute al objeto anónimo (que en realidad es un Diccionario) con el valor “deshabilitado”, de lo contrario, no agrega la propiedad en absoluto.

public static RouteValueDictionary ConditionalDisable(
   bool disabled, 
   object htmlAttributes = null)

   var dictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

   if (disabled)
      dictionary.Add("disabled", "disabled");

   return dictionary;

Un ejemplo de ello en acción:

@Html.TextBoxFor(m => m.SomeProperty,    
   HtmlHelpers.ConditionalDisable(true, new { @class = "someClass"))

Para mí, una gran ventaja de este enfoque fue que funciona con prácticamente todos los HtmlHelpers de MVC, ya que todos tienen sobrecargas que aceptan un RouteValueDictionary en lugar de un objeto anónimo.

Advertencias:
HtmlHelper.AnonymousObjectToHtmlAttributes() utiliza un trabajo sofisticado de código ninja para hacer las cosas. No estoy del todo seguro de su rendimiento… pero ha sido suficiente para lo que lo uso. Su experiencia puede ser diferente.

No me gusta mucho el nombre, pero no se me ocurrió nada mejor. Cambiar el nombre es fácil.

Tampoco me gusta la sintaxis de uso, pero de nuevo no se me ocurrió nada mejor. No debería ser difícil cambiar. Un método de extensión en el objeto es una idea… terminarías con new @class = "someClass" .ConditionalDisable(true) pero entonces, si solo quieres deshabilitar attribute y no tienes nada adicional que agregar, terminas con algo asqueroso como new .ConditionalDisable(true); y también termina con un método de extensión que aparece para todos object… lo que probablemente no sea deseable.

Si desea una sintaxis más concisa sin requerir una función de ayuda, puede usar una declaración ternaria al definir el diccionario utilizado para el html attributes del ayudante @HTML.Checkbox…

@Html.CheckBox("CheckBox1", true, Model.ReadOnly 
       ? new  @class = "Class1", @disabled = Model.ReadOnly  
       : null)

En este caso es Model.ReadOnly es false, null se pasa como el diccionario de html attributes.

Si te gustó nuestro trabajo, tienes la habilidad dejar un tutorial acerca de qué le añadirías a este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *