¿Cómo puedo tener una costumbre ValidationAttribute representa como un atributo 'data-val-xx' en el lado del cliente?
-
29-09-2019 - |
Pregunta
Dado un modelo de vista que es similar al siguiente:
public class Login {
[Required]
public string Username { get; set; }
[Required, CustomValidator]
public string Password { get; set; }
}
Y una vista como esta (Razor sintaxis aquí):
@Html.TextBoxFor(f => f.Password)
Recibo el siguiente marcado:
<input type="text"
value=""
data-val-required="This field is required." />
Sin embargo, me gustaría que también incluirá un atributo 'Data-' para mi costumbre validador.
Quiero algo como esto:
<input type="text"
value=""
data-val-required="This field is required."
data-val-customvalidator="XYZ" />
¿Cómo puedo lograr esto con ASP.NET MVC 3.0?
por ejemplo. ¿Es necesario poner algún atributo especial en mi validador personalizado? O registrarse en alguna parte?
Solución
Bueno, me salvó de MSDN (como suele ocurrir).
http://msdn.microsoft.com/en-us/library/ ff398048.aspx
Así que primero tengo que crear un adaptador para mi atributo de validación:
public class CustomAttributeAdapter : DataAnnotationsModelValidator<EmailAttribute>
{
public CustomAttributeAdapter(
ModelMetadata metadata,
ControllerContext context,
CustomAttribute attribute) :
base(metadata, context, attribute)
{
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
ModelClientValidationRule rule = new ModelClientValidationRule()
{
ErrorMessage = ErrorMessage,
ValidationType = "custom"
};
return new ModelClientValidationRule[] { rule };
}
}
(La 'ValidationType' el ajuste de debe sea minúscula para que esto funcione, ya que este es el post-fix que será utilizado como un atributo HTML 5 - 'data-val-costumbre'. )
A continuación, todo lo que necesita hacer es registrarlo en Application_Start.
DataAnnotationsModelValidatorProvider.RegisterAdapter(
typeof(EmailAttribute),
typeof(EmailAttributeAdapter));
Mirando hacia adelante a un montón de diversión con la validación HTML5. :)