ASP.NET MVC - validacion de datos
-
Upload
danae-aguilar-guzman -
Category
Software
-
view
136 -
download
11
Transcript of ASP.NET MVC - validacion de datos
Validacion en el servidor
Validación en el servidor
Siempre validar en el lado del servidor, porque los usuarios pueden deshabilitarjavascript en sus navegadores.
Data Annotations
Son atributos definidos en System.ComponentModel.DataAnnotationsque nos permiten especificar como debenvalidarse los datos
Data Annotations
RegularExpressionAttribute, Los datosdeben matchear una expression regular dada.
CompareAttribute, Compara si los valoresde 2 propiedades del modelo son iguales
[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")] public string Email { get; set; }
[Compare("Email")] public string ConfirmacionEmail { get; set; }
Data Annotations
RequiredAttribute, Indica que se require un valor
StringLengthAttribute, El maximo de caracteres permitidos.
[Required] public string Nombre { get; set; }
[StringLength(160)] public string Apellido { get; set; }
[StringLength(160, MinimumLength = 3)] public string Nombre { get; set; }
Data Annotations
RangeAttribute, Especifica un rango de valores permitidos.
[Range(21, 50)] public int Edad { get; set; }
[Range(typeof(decimal), "0.50", "89.99")] public decimal Precio { get; set; }
[Range(typeof(DateTime), "1/1/2013", "12/31/9999")] public DateTime FechaInicio { get; set; }
Data Annotations
RemoteAttribute, Hace que jQuery Validate llame a una accion en el server para realizer la validación
Especificamos el action y el controller:
El action realiza la validación:
[Remote("ValidarNombreUsuario", "Cuentas")] public string NombreUsuario { get; set; }
public JsonResult ValidarNombreUsuario(string nombreUsuario) { List<string> usuarios = new List<string>() {"Juanito", "Pepito"}; // Alguna valicadion: bool resultado = usuarios.Any(u => u == nombre); return Json(resultado, JsonRequestBehavior.AllowGet); }
Data Annotations
Para saber si los datos son válidos:
Preguntar si el valor de ModelState.IsValides true
[HttpPost] public ActionResult CrearEmpleado(Empleado empleado) { if (ModelState.IsValid) { return View("DatosCreados"); } return View(new Empleado()); }
Data Annotations
Mensajes de error personalizados:
Especificar el valor de ErrorMessage
[StringLength(160, ErrorMessage="Ingrese máximo 160 caracteres")] public string Apellido { get; set; }
Data Annotations
Mostrando los errorres:
Agregamos jqueryval:
@using (Html.BeginForm()) { @Html.ValidationSummary() <p> @Html.LabelFor(model => model.Apellido) @Html.EditorFor(model => model.Apellido) @Html.ValidationMessageFor(model => model.Apellido, "*") </p> <input type="submit" value="OK" /> }
@section scripts { @Scripts.Render("~/bundles/jqueryval") }
Data Annotations Personalizados
1. Creamos una clase que herede de ValidationAttribute:
public class MaximasPalabrasAttribute : ValidationAttribute { private int maximoPalabras; public MaximasPalabrasAttribute(int maximoPalabras) { this.maximoPalabras = maximoPalabras; }
Data Annotations Personalizados
2. Sobreescribimos el metodo IsValid:
protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value != null) { var cadena = value.ToString(); if (cadena.Split(' ').Length > maximoPalabras) { return new ValidationResult("Muchas palabras!"); } } return ValidationResult.Success; }
Data Annotations Personalizados
3. Aplicamos nuestro nuevo atributo:
[MaximasPalabras(2)] public string Apellido { get; set; }
Data Annotations Personalizados
3.2. Permitir mensajes de error diferentes:
En el constructor:
Retornando el error:
public MaximasPalabrasAttribute(int maximoPalabras) : base("{0} tiene muchas palabras.") {
var mensaje = FormatErrorMessage(validationContext.DisplayName); return new ValidationResult(mensaje);
Otros Data Annotations
Display, permite especificar el texto del label, y tambien el orden.
ScaffoldColumn, para marcar laspropiedades que no deben incluirse cuandousamos EditorForModel o DisplayForModel
[Display(Name = "Ingrese su Apellido", Order = 2)] public string Apellido { get; set; }
[ScaffoldColumn(false)] public string Apellido { get; set; }
Otros Data Annotations
DisplayFormat, permite especificar el format de los datos.
ReadOnly, no se modificara el valor del modelo con los datos que ingrese el usuario
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}")] public decimal Total { get; set; }
[ReadOnly(true)]
public decimal Total { get; set; }
Otros Data Annotations
DataType, permite especificar el tipo de los datos.
HiddenInput, Los datos se enviaran en un input oculto par ael usuario
[DataType(DataType.Password)] public string Password { get; set; }
[HiddenInput] public string Apellido { get; set; }
Self Validation
Self Validation
Son modelos que pueden validarse a simismos
Implementan la interfaz IValidatableObject
public class Estudiante : IValidatableObject { public IEnumerable<ValidationResult> Validate( ValidationContext validationContext) { if (Apellido != null && Apellido.Split(' ').Length > 2) { yield return new ValidationResult("El apellido es incorrecto!", new[] { "Apellido" }); } } public string Apellido { get; set; } }