Resulta algo paradójico que ASP.NET MVC sea capaz de generar código para comprobar tanto en cliente como en servidor que la longitud del texto introducido sea menor que la indicada con la anotación [StringLength], y sin embargo, los helpers habituales no generen el atributo maxlength en el tag <input type="text">.
Podemos comprobarlo muy fácilmente. Por ejemplo, dada una entidad del Modelo como la siguiente:
public class Persona
{
[StringLength(20, ErrorMessage="Máximo {1} caracteres")]
public string Nombre { get; set; }
}
Si creamos su vista de edición por defecto e introducimos en ella los validadores en cliente, obtendremos en tiempo de ejecución un resultado como el que podemos apreciar en la siguiente captura de pantalla:
Es decir, los validadores automáticos, tanto en cliente como en servidor, nos avisan de que hemos superado el número máximo de caracteres a introducir, pero no se impide que esto se produzca mediante el atributo
maxlength de la etiqueta el tag
<input type="text">.
Afortunadamente hay varias formas de solucionar este pequeño inconveniente, como creando nuevos helpers o utilizando plantillas de edición personalizadas. En este post veremos cómo implementar la primera opción, creando un helper que realice la tarea de forma automática.
Html.LimitedTextBoxFor()
Vale, sé que no es un nombre estupendo para el helper, pero de momento va a tener que valer con ese ;-P. La idea es que podamos generar text boxes que limiten el número de caracteres permitidos en función de lo indicado en las anotaciones del Modelo. Es decir, sobre el ejemplo anterior, ocurriría lo siguiente:
// En la vista:
<%= Html.LimitedTextBoxFor(model => model.Nombre ) %>
// HTML resultante:
<input id="Nombre" maxlength="20" name="Nombre" type="text" value="" />
El código del helper es el siguiente, y lo comento brevemente justo a continuación:
public static MvcHtmlString LimitedTextBoxFor<TModel, TProperty>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TProperty>> expression,
IDictionary<string, object> htmlAttributes)
{
// Obtenemos los metadatos de la propiedad
ModelMetadata metadata =
ModelMetadata.FromLambdaBLOCKED EXPRESSION;
}
Y eso es todo. Si sustituimos en nuestras vistas las llamadas a
TextBoxFor por
LimitedTextBoxFor tendremos la cuestión solucionada. Otra posibilidad, bastante más cómoda, sería
retocar las plantillas de edición generadas por Visual Studio para que incluyan las llamadas a estos nuevos helpers.
Podéis encontrar
el código fuente completo en Skydrive.
Publicado en:
Variable not found.
Hey, ¿
sabes que estoy en Twitter?