Documente Academic
Documente Profesional
Documente Cultură
css Buscar
Login | Registro
[AttributeUsage(AttributeTargets.Property)]
public class NumeroParAttribute : ValidationAttribute
{
{
public override bool IsValid(object value)
{
try
{
var number = Convert.ToInt32(value);
return number % 2 == 0;
}
catch (Exception)
{
return base.IsValid(value);
}
}
}
El atributo AtributeUsage se usa para indicarle a .NET donde es válido aplicar este atributo (esto es
siempre que se creen atributos, ya sean para validaciones o para cualquier otra tarea). Aquí estamos
indicando que este atributo se aplica a propiedades, no a métodos o a parámetros.
Una vez creado el atributo su uso es como cualquiera de los que vienen de serie: basta con aplicarlo a
las propiedades que deseemos validar.
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>DemoModel</legend>
<div class="editor-label">
@Html.LabelFor(model => model.ValorPar)
@Html.LabelFor(model => model.ValorPar)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ValorPar)
@Html.ValidationMessageFor(model => model.ValorPar)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
Y podríamos comprobar como en efecto tan solo podemos entrar números pares, comprendidos entre 1
y 100:
El siguiente paso es informar a jQuery Validate cuando debe llamar a este validador "numeropar" que
hemos añadido. Para ello necesitaremos código en cliente y en servidor.
La interfaz IClientValidatable
Empecemos por el código de servidor: nuestro atributo de validación debe implementar una
interfaz llamada IClientValidatable. Esta interfaz requiere que implementemos un solo
método llamado GetClientValidationRules, que debe devolver una colección de objetos de la
clase ModelClientValidationRule.
La clase ModelClientValidationRule contiene el nombre de la regla de validación en cliente a aplicar y el
mensaje de error en caso de que dicha validación falle. En nuestro caso una posible implementación es:
public IEnumerable<ModelClientValidationRule>
GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "numeropar"
};
}
Nota: ¿Conoces la palabra clave yield? Esa palabra clave de C# permite devolver colecciones sin necesidad de crear
una clase que implemente la colección (usualmente una List<T>). Para más información te remito al blog de José
Manuel Alarcón donde lo cuenta de forma fenomenal:
http://www.jasoft.org/Blog/post/PermaLinkaspxguid=8dfbbe0c-7851-4cb8-8a49-150be21.aspx
Vale, hemos creado en cliente un validador llamado "numeropar" y hemos modificado nuestro atributo
para indicar que debe usarse la regla de validación en cliente llamada "numeropar". Parece que todo
debería funcionar
pero todavía nos queda un último detalle.
<div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-number="The field
ValorPar must be a number." data-val-numeropar="El número debe ser par." data-val-
range="Positivo menor que 100" data-val-range-max="100" data-val-range-min="1"
data-val-required="The ValorPar field is required." id="ValorPar" name="ValorPar"
type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="ValorPar" data-valmsg-
replace="true"></span>
</div>
Todos los atributos data-val que contiene el <input> son para las validaciones usando javascript no
obtrusivo. De hecho puedes observar que existe un atributo llamado data-val-numeropar. Ese atributo
se ha generado porque precisamente hemos implementado IClientValidatable en nuestro atributo de
servidor. Bien, por un lado tenemos un validador llamado "numeropar" que hemos dado de alta en
jQuery Validate. Por otro tenemos el atributo data-val-numeropar que se ha generado al implementar
IClientValidatable en nuestro atributo. Tan solo nos falta indicar a jQuery Validate que debe usar el
validador llamado "numeropar" en todos aquellos campos que tengan el atributo "data-val-numeropar".
Para ello debemos usar el siguiente código javascript:
$.validator.unobtrusive.adapters.addBool("numeropar");
Con este código se enlaza el validador numeropar de jQuery Validate, con el atributo data-val-
numeropar.
Fijaos en el segundo parámetro del método addBool: indica que la regla "np" debe validarse usando el
validador "numeropar" (si no se pone el parámetro se asume que el nombre es el mismo).
Por supuesto ahora la regla se llama "np", y no "numeropar", por lo que cuando se implemente
IClientValidatable debe usarse "np":
public IEnumerable<ModelClientValidationRule>
GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "np"
};
@model MvcApplication2.Models.DemoModel
<h2>
ViewPage1</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"
type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"
type="text/javascript"></script>
<script type="text/javascript">
$.validator.addMethod("numeropar", function (value, element, param) {
return value % 2 == 0;
});
$.validator.unobtrusive.adapters.addBool("np", "numeropar");
</script>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>DemoModel</legend>
<div class="editor-label">
@Html.LabelFor(model => model.ValorPar)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ValorPar)
@Html.ValidationMessageFor(model => model.ValorPar)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
¡Ahora sí! Hemos creado una validación propia y que se valida no solo en servidor sino también en
cliente!
En resumen
Hemos visto cómo funciona el sistema de validaciones basadas en atributos en ASP.NET
MVC3. También hemos visto lo sencillo que es crear nuestras propias validaciones usando
atributos propios y como añadir validación en cliente en javascript. Por supuesto os animo a
que entendáis como funciona jQuery Validate (hemos visto el tipo de validadores más
sencillos que existen, los que sólo validan un valor, pero los hay que pueden recibir
parámetros para validar rangos, o hacer comparaciones). No entraremos más en detalle en
jQuery Validate porque cae fuera del ámbito de este manual.
¿Y sobre las validaciones? Pues no hemos terminado todavía
¡hay un par de cosillas más que creo
interesantes y que veremos en el siguiente artículo!
AqpHost
aqphost.com
hosting de calidad para tus clientes y tus proyectos web
Autor
Eduard Tomàs
Seguir a @eixim enis
Subir
Subir
Manual
Manual del framework ASP.NET MVC
Compartir
4 17
Recom endar
Comentarios
Enviar un comentario al artículo
Eduardo
Mas articulos 07/3/2012
Hasta ahora el maual genial pero sería aún mejor si los artículos se publicaran con
mayor frecuencia, y ojala se tocaran mas temas para las vistas (ajax, jquery dropdowns
dependientes de otros dropdown, etc.