SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
Validacion de Datos
Danae Aguilar Guzmán
MCT, MS, MCTS, MCP
danae.aguilar@jalasoft.com
Validacion en el servidor
Validación en el servidor
 Siempre validar en el lado del servidor,
porque los usuarios pueden deshabilitar
javascript en sus navegadores.
Data Annotations
 Son atributos definidos en
System.ComponentModel.DataAnnotations
que nos permiten especificar como deben
validarse los datos
Data Annotations
 RegularExpressionAttribute, Los datos
deben matchear una expression regular
dada.
 CompareAttribute, Compara si los valores
de 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.IsValid
es 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 las
propiedades que no deben incluirse cuando
usamos 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 si
mismos
 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; }
}

Más contenido relacionado

La actualidad más candente

Ventana de inicio de MySQL Workbench
Ventana de inicio de MySQL WorkbenchVentana de inicio de MySQL Workbench
Ventana de inicio de MySQL WorkbenchJair Ospino Ardila
 
What is Docker Architecture | Edureka
What is Docker Architecture | EdurekaWhat is Docker Architecture | Edureka
What is Docker Architecture | EdurekaEdureka!
 
CUESTIONARIO JAVA
CUESTIONARIO JAVACUESTIONARIO JAVA
CUESTIONARIO JAVAjesanchez5
 
AWS Infrastructure as Code - September 2016 Webinar Series
AWS Infrastructure as Code - September 2016 Webinar SeriesAWS Infrastructure as Code - September 2016 Webinar Series
AWS Infrastructure as Code - September 2016 Webinar SeriesAmazon Web Services
 
AWS Power Tools: Advanced AWS CloudFormation and CLI
AWS Power Tools: Advanced AWS CloudFormation and CLIAWS Power Tools: Advanced AWS CloudFormation and CLI
AWS Power Tools: Advanced AWS CloudFormation and CLIAmazon Web Services
 
DEV323_Introduction to the AWS CLI
DEV323_Introduction to the AWS CLIDEV323_Introduction to the AWS CLI
DEV323_Introduction to the AWS CLIAmazon Web Services
 
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11Miguel Angel
 
Manual configuración GPO
Manual configuración GPOManual configuración GPO
Manual configuración GPOcyberleon95
 
AWS reInforce 2021: TDR202 - Lessons learned from the front lines of Incident...
AWS reInforce 2021: TDR202 - Lessons learned from the front lines of Incident...AWS reInforce 2021: TDR202 - Lessons learned from the front lines of Incident...
AWS reInforce 2021: TDR202 - Lessons learned from the front lines of Incident...Brian Andrzejewski
 
K8s on AWS - Introducing Amazon EKS
K8s on AWS - Introducing Amazon EKSK8s on AWS - Introducing Amazon EKS
K8s on AWS - Introducing Amazon EKSAmazon Web Services
 

La actualidad más candente (20)

Ventana de inicio de MySQL Workbench
Ventana de inicio de MySQL WorkbenchVentana de inicio de MySQL Workbench
Ventana de inicio de MySQL Workbench
 
Manual sql server parte 1
Manual sql server parte 1Manual sql server parte 1
Manual sql server parte 1
 
What is Docker Architecture | Edureka
What is Docker Architecture | EdurekaWhat is Docker Architecture | Edureka
What is Docker Architecture | Edureka
 
Bases de datos con PHP y PDO
Bases de datos con PHP y PDOBases de datos con PHP y PDO
Bases de datos con PHP y PDO
 
CUESTIONARIO JAVA
CUESTIONARIO JAVACUESTIONARIO JAVA
CUESTIONARIO JAVA
 
AWS Infrastructure as Code - September 2016 Webinar Series
AWS Infrastructure as Code - September 2016 Webinar SeriesAWS Infrastructure as Code - September 2016 Webinar Series
AWS Infrastructure as Code - September 2016 Webinar Series
 
Amazon GuardDuty Lab
Amazon GuardDuty LabAmazon GuardDuty Lab
Amazon GuardDuty Lab
 
Ado net
Ado netAdo net
Ado net
 
Deep Dive: AWS CloudFormation
Deep Dive: AWS CloudFormationDeep Dive: AWS CloudFormation
Deep Dive: AWS CloudFormation
 
Docker Compose Explained
Docker Compose ExplainedDocker Compose Explained
Docker Compose Explained
 
Reduzca sus costos con Windows en AWS
Reduzca sus costos con Windows en AWSReduzca sus costos con Windows en AWS
Reduzca sus costos con Windows en AWS
 
AWS Power Tools: Advanced AWS CloudFormation and CLI
AWS Power Tools: Advanced AWS CloudFormation and CLIAWS Power Tools: Advanced AWS CloudFormation and CLI
AWS Power Tools: Advanced AWS CloudFormation and CLI
 
Introduction to AWS Security
Introduction to AWS SecurityIntroduction to AWS Security
Introduction to AWS Security
 
Packer by HashiCorp
Packer by HashiCorpPacker by HashiCorp
Packer by HashiCorp
 
DEV323_Introduction to the AWS CLI
DEV323_Introduction to the AWS CLIDEV323_Introduction to the AWS CLI
DEV323_Introduction to the AWS CLI
 
Entity framework
Entity frameworkEntity framework
Entity framework
 
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
 
Manual configuración GPO
Manual configuración GPOManual configuración GPO
Manual configuración GPO
 
AWS reInforce 2021: TDR202 - Lessons learned from the front lines of Incident...
AWS reInforce 2021: TDR202 - Lessons learned from the front lines of Incident...AWS reInforce 2021: TDR202 - Lessons learned from the front lines of Incident...
AWS reInforce 2021: TDR202 - Lessons learned from the front lines of Incident...
 
K8s on AWS - Introducing Amazon EKS
K8s on AWS - Introducing Amazon EKSK8s on AWS - Introducing Amazon EKS
K8s on AWS - Introducing Amazon EKS
 

Similar a Validación de datos con Data Annotations (20)

Prepared statement
Prepared statementPrepared statement
Prepared statement
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBC
 
Entrenamiento en Acceso a Datos con ASP.NET
Entrenamiento en Acceso a Datos con ASP.NETEntrenamiento en Acceso a Datos con ASP.NET
Entrenamiento en Acceso a Datos con ASP.NET
 
PreparedStatement
PreparedStatementPreparedStatement
PreparedStatement
 
06 validación
06 validación06 validación
06 validación
 
preparedStatement
preparedStatementpreparedStatement
preparedStatement
 
Struts2
Struts2Struts2
Struts2
 
Statement
StatementStatement
Statement
 
CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010
 
Ado
AdoAdo
Ado
 
PREPAREDSTATEMENT
PREPAREDSTATEMENTPREPAREDSTATEMENT
PREPAREDSTATEMENT
 
Prepared statement
Prepared statementPrepared statement
Prepared statement
 
Actividad autónoma: Controles de validacion en ASP.NET
Actividad autónoma: Controles de validacion en ASP.NETActividad autónoma: Controles de validacion en ASP.NET
Actividad autónoma: Controles de validacion en ASP.NET
 
JAVA CON BASE DE DATOS
JAVA CON BASE DE DATOSJAVA CON BASE DE DATOS
JAVA CON BASE DE DATOS
 
Presentacion ajax
Presentacion   ajaxPresentacion   ajax
Presentacion ajax
 
Connection Java
Connection JavaConnection Java
Connection Java
 
MyBatis como alternativa a Hibernate
MyBatis como alternativa a HibernateMyBatis como alternativa a Hibernate
MyBatis como alternativa a Hibernate
 
Objeto Sql Command
Objeto Sql CommandObjeto Sql Command
Objeto Sql Command
 
10. consumiendo datos
10. consumiendo datos10. consumiendo datos
10. consumiendo datos
 
Preparedstatement
PreparedstatementPreparedstatement
Preparedstatement
 

Más de Danae Aguilar Guzmán

WPF 10. mejorando la funcionalidad y usabilidad de las aplicaciones
WPF 10. mejorando la funcionalidad y usabilidad de las aplicacionesWPF 10. mejorando la funcionalidad y usabilidad de las aplicaciones
WPF 10. mejorando la funcionalidad y usabilidad de las aplicacionesDanae Aguilar Guzmán
 
WPF 09. procesos asíncronos y programación paralela
WPF 09. procesos asíncronos y programación paralelaWPF 09. procesos asíncronos y programación paralela
WPF 09. procesos asíncronos y programación paralelaDanae Aguilar Guzmán
 
WPF 08 - manejo y vinculación de datos
WPF 08 - manejo y vinculación de datosWPF 08 - manejo y vinculación de datos
WPF 08 - manejo y vinculación de datosDanae Aguilar Guzmán
 
WPF 07 - gráficos, animación y multimedia
WPF 07 - gráficos, animación y multimediaWPF 07 - gráficos, animación y multimedia
WPF 07 - gráficos, animación y multimediaDanae Aguilar Guzmán
 
WPF 06 - personalizando los controles de interfaz de usuario
WPF 06 -  personalizando los controles de interfaz de usuarioWPF 06 -  personalizando los controles de interfaz de usuario
WPF 06 - personalizando los controles de interfaz de usuarioDanae Aguilar Guzmán
 
WPF 04 - reutilizando recursos y estilos en una aplicación WPF
WPF 04 -  reutilizando recursos y estilos en una aplicación WPF WPF 04 -  reutilizando recursos y estilos en una aplicación WPF
WPF 04 - reutilizando recursos y estilos en una aplicación WPF Danae Aguilar Guzmán
 
WPF 02 - construyendo una interfaz de usuario
WPF 02  - construyendo una interfaz de usuarioWPF 02  - construyendo una interfaz de usuario
WPF 02 - construyendo una interfaz de usuarioDanae Aguilar Guzmán
 
ASP.NET MVC - introduccion al web api
ASP.NET MVC - introduccion al web apiASP.NET MVC - introduccion al web api
ASP.NET MVC - introduccion al web apiDanae Aguilar Guzmán
 
ASP.NET MVC - bundling y minification
ASP.NET MVC - bundling y minificationASP.NET MVC - bundling y minification
ASP.NET MVC - bundling y minificationDanae Aguilar Guzmán
 
ASP.NET MVC - implementando globalizacion and localizacion
ASP.NET MVC - implementando globalizacion and localizacionASP.NET MVC - implementando globalizacion and localizacion
ASP.NET MVC - implementando globalizacion and localizacionDanae Aguilar Guzmán
 
ASP.NET MVC - areas, manejo de estado
ASP.NET MVC - areas, manejo de estadoASP.NET MVC - areas, manejo de estado
ASP.NET MVC - areas, manejo de estadoDanae Aguilar Guzmán
 
ASP.NET MVC - layouts y vistas parciales
ASP.NET MVC - layouts y vistas parcialesASP.NET MVC - layouts y vistas parciales
ASP.NET MVC - layouts y vistas parcialesDanae Aguilar Guzmán
 
ASP.NET MVC - Introducción a ASP.NET MVC
ASP.NET MVC - Introducción a ASP.NET MVCASP.NET MVC - Introducción a ASP.NET MVC
ASP.NET MVC - Introducción a ASP.NET MVCDanae Aguilar Guzmán
 
Crecimiento profesional como desarrollador de software
Crecimiento profesional como desarrollador de softwareCrecimiento profesional como desarrollador de software
Crecimiento profesional como desarrollador de softwareDanae Aguilar Guzmán
 
09. Creando interfaces de usuario animadas y adaptables
09. Creando interfaces de usuario animadas y adaptables09. Creando interfaces de usuario animadas y adaptables
09. Creando interfaces de usuario animadas y adaptablesDanae Aguilar Guzmán
 

Más de Danae Aguilar Guzmán (20)

Microsoft HoloLens
Microsoft HoloLensMicrosoft HoloLens
Microsoft HoloLens
 
WPF 10. mejorando la funcionalidad y usabilidad de las aplicaciones
WPF 10. mejorando la funcionalidad y usabilidad de las aplicacionesWPF 10. mejorando la funcionalidad y usabilidad de las aplicaciones
WPF 10. mejorando la funcionalidad y usabilidad de las aplicaciones
 
WPF 09. procesos asíncronos y programación paralela
WPF 09. procesos asíncronos y programación paralelaWPF 09. procesos asíncronos y programación paralela
WPF 09. procesos asíncronos y programación paralela
 
WPF 08 - manejo y vinculación de datos
WPF 08 - manejo y vinculación de datosWPF 08 - manejo y vinculación de datos
WPF 08 - manejo y vinculación de datos
 
WPF 07 - gráficos, animación y multimedia
WPF 07 - gráficos, animación y multimediaWPF 07 - gráficos, animación y multimedia
WPF 07 - gráficos, animación y multimedia
 
WPF 06 - personalizando los controles de interfaz de usuario
WPF 06 -  personalizando los controles de interfaz de usuarioWPF 06 -  personalizando los controles de interfaz de usuario
WPF 06 - personalizando los controles de interfaz de usuario
 
WPF 05 - triggers y eventos
WPF 05 - triggers y eventosWPF 05 - triggers y eventos
WPF 05 - triggers y eventos
 
WPF 04 - reutilizando recursos y estilos en una aplicación WPF
WPF 04 -  reutilizando recursos y estilos en una aplicación WPF WPF 04 -  reutilizando recursos y estilos en una aplicación WPF
WPF 04 - reutilizando recursos y estilos en una aplicación WPF
 
WPF 03 - controles WPF
WPF 03 - controles WPF WPF 03 - controles WPF
WPF 03 - controles WPF
 
WPF 02 - construyendo una interfaz de usuario
WPF 02  - construyendo una interfaz de usuarioWPF 02  - construyendo una interfaz de usuario
WPF 02 - construyendo una interfaz de usuario
 
WPF 01 - introducción
WPF 01 -  introducciónWPF 01 -  introducción
WPF 01 - introducción
 
ASP.NET MVC - introduccion al web api
ASP.NET MVC - introduccion al web apiASP.NET MVC - introduccion al web api
ASP.NET MVC - introduccion al web api
 
ASP.NET MVC - bundling y minification
ASP.NET MVC - bundling y minificationASP.NET MVC - bundling y minification
ASP.NET MVC - bundling y minification
 
ASP.NET MVC - AJAX
ASP.NET MVC - AJAXASP.NET MVC - AJAX
ASP.NET MVC - AJAX
 
ASP.NET MVC - implementando globalizacion and localizacion
ASP.NET MVC - implementando globalizacion and localizacionASP.NET MVC - implementando globalizacion and localizacion
ASP.NET MVC - implementando globalizacion and localizacion
 
ASP.NET MVC - areas, manejo de estado
ASP.NET MVC - areas, manejo de estadoASP.NET MVC - areas, manejo de estado
ASP.NET MVC - areas, manejo de estado
 
ASP.NET MVC - layouts y vistas parciales
ASP.NET MVC - layouts y vistas parcialesASP.NET MVC - layouts y vistas parciales
ASP.NET MVC - layouts y vistas parciales
 
ASP.NET MVC - Introducción a ASP.NET MVC
ASP.NET MVC - Introducción a ASP.NET MVCASP.NET MVC - Introducción a ASP.NET MVC
ASP.NET MVC - Introducción a ASP.NET MVC
 
Crecimiento profesional como desarrollador de software
Crecimiento profesional como desarrollador de softwareCrecimiento profesional como desarrollador de software
Crecimiento profesional como desarrollador de software
 
09. Creando interfaces de usuario animadas y adaptables
09. Creando interfaces de usuario animadas y adaptables09. Creando interfaces de usuario animadas y adaptables
09. Creando interfaces de usuario animadas y adaptables
 

Validación de datos con Data Annotations

  • 1. Validacion de Datos Danae Aguilar Guzmán MCT, MS, MCTS, MCP danae.aguilar@jalasoft.com
  • 2. Validacion en el servidor Validación en el servidor  Siempre validar en el lado del servidor, porque los usuarios pueden deshabilitar javascript en sus navegadores. Data Annotations  Son atributos definidos en System.ComponentModel.DataAnnotations que nos permiten especificar como deben validarse los datos
  • 3. Data Annotations  RegularExpressionAttribute, Los datos deben matchear una expression regular dada.  CompareAttribute, Compara si los valores de 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; }
  • 4. 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; }
  • 5. 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; }
  • 6. 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); }
  • 7. Data Annotations Para saber si los datos son válidos:  Preguntar si el valor de ModelState.IsValid es true [HttpPost] public ActionResult CrearEmpleado(Empleado empleado) { if (ModelState.IsValid) { return View("DatosCreados"); } return View(new Empleado()); }
  • 8. Data Annotations Mensajes de error personalizados:  Especificar el valor de ErrorMessage [StringLength(160, ErrorMessage="Ingrese máximo 160 caracteres")] public string Apellido { get; set; }
  • 9. 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") }
  • 10. 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; }
  • 11. 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; }
  • 12. Data Annotations Personalizados 3. Aplicamos nuestro nuevo atributo: [MaximasPalabras(2)] public string Apellido { get; set; }
  • 13. 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);
  • 14. Otros Data Annotations  Display, permite especificar el texto del label, y tambien el orden.  ScaffoldColumn, para marcar las propiedades que no deben incluirse cuando usamos EditorForModel o DisplayForModel [Display(Name = "Ingrese su Apellido", Order = 2)] public string Apellido { get; set; } [ScaffoldColumn(false)] public string Apellido { get; set; }
  • 15. 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; }
  • 16. 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; }
  • 17. Self Validation Self Validation  Son modelos que pueden validarse a si mismos  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; } }