Cuando tienes un “ViewModel”, puedes utilizar estas anotaciones en cada propiedad:
[Required(ErrorMessage = "Requerido")]
public string Nombres { get; set; }
Sin embargo, también puedes especificar validaciones conformadas por reglas más complicadas que utilicen varias propiedades.
Por ejemplo, validar que el parámetro de un URL contenga únicamente letras, minúsculas y guiones y que además este URL no esté asociado ya con otro registro en la base de datos.
Para realizar la validación en todo el “ViewModel”, haz lo siguiente.
Haz que la clase herede de “IValidatableObject”, de esta forma:
public class MiViewModel : IValidatableObject
Después crea este método dentro de “MiViewModel”:
public IEnumerable Validate(ValidationContext validationContext)
Y dentro de él coloca tus reglas.
Para el ejemplo que mencioné arriba, el método completo quedaría así:
public IEnumerable Validate(ValidationContext validationContext)
{
// # Que haya solamente letras minusculas, números y guiones en el URL
bool BanderaURL = Regex.IsMatch(URL, @"^[a-z0-9-]+$");
if (Regex.IsMatch(URL, @"^[a-z0-9-]+$") == false)
{
yield return new ValidationResult("El URL contiene caracteres no válidos.", new[] { "URL" });
}
// # Que no exista previamente el URL que quieren colocar
if (miRepositorio.ChecarSiYaExisteElURL(URL) == true)
{
yield return new ValidationResult("El URL ya está asociado con otro registro.", new[] { "URL" });
}
}
El valor que regresamos con “ValidationResult” en la línea que comienza con “yield” recibe primero la descripción del error, y después un arreglo con las propiedades que están generando dicho error. En nuestro caso es solamente una.
Si la información ingresada por el usuario no pasa la validación, entonces los mensajes que estableciste aparecerán en donde coloques este código en tu “View” (.cshtml):
@Html.ValidationMessageFor(model => model.URL, "", new { @class = "help-block text-danger" })
Nota que nos estamos refiriendo a la propiedad “URL” del “model”, que coincide con la que utilizamos arriba en la línea que empieza con “yield”. Si no coinciden, no aparecerá el mensaje de error.
Y también podrás evaluarlas en tu código con:
if (ModelState.IsValid)