Variable not found
¿Bug (sin importancia) en la plantilla de edición de MVC 2 con DateTime, decimal y double?
Mayo 24th, 2010 - [Enlace local]
¿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 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.