lunes, 24 de mayo de 2010
¿Habéis observado que al generar una vista de edición tipada sobre una entidad que contiene propiedades decimales o de fecha, Visual Studio os genera una llamada extraña al helper
Vamos a verlo en detalle. Partimos de una entidad del Modelo como la siguiente:
Generamos ahora el andamiaje con Visual Studio, utilizando la opción correspondiente del menú contextual, indicando que se trata de una vista de edición, sobre la entidad
El código generado por el entorno será el habitual. Sin embargo, si nos fijamos en el control de edición que Visual Studio ha generado para la propiedad
Durante mucho tiempo no me ha llamado la atención probablemente por la costumbre de verlo en llamadas al helper
Sin embargo, en cuanto observas un poco las distintas sobrecargas de TextBoxFor()
¿Ein? ¿Length=”15”? ¿Te suena esto a algo? Seguro que sí ;-)
Efectivamente, el atributo extraño de la etiqueta
Curiosamente, el
Pero bueno, ya que tenemos el destornillador en la mano, cuesta muy poco trabajo dejar las cosas en su sitio ;-). Como vimos en otra ocasión, el código de las vistas que genera Visual Studio está basado en plantillas T4, y es realmente sencillo modificarlo, así que vamos a ello.
En primer lugar, acudimos a la carpeta del IDE donde se almacenan estas plantillas:
A continuación hacemos una copia de seguridad de la plantilla llamada Edit.tt (que más vale prevenir…), la abrimos con cualquier editor de texto y buscamos en su la cadena “TextBoxFor”, que encontraremos en una porción de código como la siguiente:
Ahora lo único que tenemos que hacer es eliminar la porción
Hecho esto, al generar de nuevo vistas de edición, ya las fechas y decimales aparecerán como deben:
En fin, se trata de un pequeño detalle en las plantillas de edición que hacen que se genere un código incorrecto al cliente. Nada importante, pero sin duda una buena excusa para profundizar en los mecanismos de andamiaje del framework.
Publicado en: Variable not found.
TextBoxFor()
?Vamos a verlo en detalle. Partimos de una entidad del Modelo como la siguiente:
Persona
:FechaNacimiento
, podremos ver que contiene un parámetro extraño:Durante mucho tiempo no me ha llamado la atención probablemente por la costumbre de verlo en llamadas al helper
TextBox()
, donde el segundo parámetro se utilizaba para especificar el valor por defecto del <input>
. Además, dado que la edición de fechas suele realizarse de forma algo más seria (en breve hablaremos de eso por aquí) y el código generado suele eliminarse, tampoco me había fijado demasiado.Sin embargo, en cuanto observas un poco las distintas sobrecargas de TextBoxFor()
, es fácil darse cuenta de que esta llamada no es correcta. De hecho, si observamos la porción del código fuente HTML generado relativa a la edición de esta propiedad, nos encontraremos con esto:Efectivamente, el atributo extraño de la etiqueta
<input>
no es más que la propiedad Length de la cadena que estamos pasando a TextBoxFor
en su segundo parámetro, reservado en la sobrecarga de TextBoxFor que encaja con la llamada para especificar los atributos HTML personalizados:public static MvcHtmlString TextBoxFor<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression,
Object htmlAttributes
)
Curiosamente, el
TextBoxFor()
sólo es generado así en las vistas de edición (Edit), y sobre propiedades de tipo DateTime
, decimal
y double
; en las vistas de creación (Create) no ocurre este problema, ni con otros tipos de datos.Pero bueno, ya que tenemos el destornillador en la mano, cuesta muy poco trabajo dejar las cosas en su sitio ;-). Como vimos en otra ocasión, el código de las vistas que genera Visual Studio está basado en plantillas T4, y es realmente sencillo modificarlo, así que vamos a ello.
En primer lugar, acudimos a la carpeta del IDE donde se almacenan estas plantillas:
- (IDE)\Common7\IDE\ItemTemplates\CSharp\Web\MVC 2\CodeTemplates\AddView
A continuación hacemos una copia de seguridad de la plantilla llamada Edit.tt (que más vale prevenir…), la abrimos con cualquier editor de texto y buscamos en su la cadena “TextBoxFor”, que encontraremos en una porción de código como la siguiente:
<#= property.Value #>
, que es la que se encarga de emitir los atributos incorrectos. De hecho, sería simplemente dejar la línea tal y como ésta aparece en la plantilla de creación (Create.tt):Publicado en: Variable not found.
Publicado por José M. Aguilar a las 11:38 p. m.
Etiquetas: asp.net, aspnetmvc, desarrollo, error, trucos
2 Comentarios:
La verdad es que estos bugs resultan de lo más interesantes para "obligarse" a hurgar en las tripas del andamiaje que utilizamos para construir nuestras aplicaciones. Ahora que ando desconectado profesionalmente del desarrollo web, cualquier excusa es buena para intentar no olvidar y, por supuesto, seguir aprendiendo.
Un saludo. :)
(Lobosoft)
Pues sí, aunque al principio pueden provocar algún que otro dolor de cabeza, sin duda nos ayudan a conocer mejor las herramientas con las que trabajamos. A mí personalmente me divierten bastante. :-)
Saludos & gracias por comentar.
Enviar un nuevo comentario