Pregunta

He estado evaluando xVal como marco para validar entidades en ASP.Net MVC Framework. Recientemente, he descubierto que cada vez que se rompe una regla de validación, xVal causa que se lance un evento. A mi me parece incorrecto. Por ejemplo, cuando un usuario llena un formulario y se olvida de llenar tres campos obligatorios, se lanzarán tres excepciones. ¿Es esta buena práctica? (Editar: También leí esto, así que supongo que no es una buena práctica)

¿Cuáles son tus experiencias al usar xVal? ¿Existe un buen marco de validación alternativo que no arroje excepciones?

Gracias

(PS: Me he dado cuenta de que mucha gente está leyendo esto, solo para informarle Estoy usando la validación de fluidez ahora)

¿Fue útil?

Otros consejos

No, no es una buena práctica mostrar excepciones en lugar de algunos mensajes simples porque nada realmente ha ido mal ... En su lugar, debe llenar ModelState con estos errores y mostrarlos en el formulario utilizando

Html.ValidationMessage("EntityPropertyName");

xVal soporta todos estos. Además de validar en el lado del cliente antes de que se vuelva a publicar el formulario.

Algún código

Cuando establezca los atributos de DataAnnotations para sus clases de entidad (o sus clases complementarias de Metadatos) lo más probable es que también implemente el método Validate (). la mejor manera sería usar T4, que generará esos automáticamente, para que no tenga que repetir el mismo código una y otra vez ...

public IEnumerable<ErrorInfo> Validate()
{
    IList<ErrorInfo> errors = DataAnnotationsValidationRunner.GetErrors(this).ToList<ErrorInfo>();
    return errors.AsEnumerable();
}

Todo lo que tienes que hacer es llamar a esto:

IEnumerable<ErrorInfo> errors = entityObjectInstance.Validate();
if (errors.Any())
{
    new RulesException(errors).AddModelStateErrors(filterContext.Controller.ViewData.ModelState, entityPropertyName);
}

Y para automatizar esto aún más, puede implementar esto en un filtro de acción, por lo que la validación será automática para los objetos de su entidad que pasan a la acción del controlador. Las acciones del controlador solo tendrían que verificar si ModelState.IsValid () entonces.

Una clase más que necesitarás aquí es (y se toma de la web en alguna parte):

public static class DataAnnotationsValidationRunner
{
    public static IEnumerable<ErrorInfo> GetErrors(object instance)
    {
        var metadataAttribute = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();
        var metaClass = metadataAttribute != null ? metadataAttribute.MetadataClassType : instance.GetType();
        var metaClassProperties = TypeDescriptor.GetProperties(metaClass).Cast<PropertyDescriptor>();
        var modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();

        return from metaProp in metaClassProperties
               join modelProp in modelClassProperties on metaProp.Name equals modelProp.Name
               from attribute in metaProp.Attributes.OfType<ValidationAttribute>()
               where !attribute.IsValid(modelProp.GetValue(instance))
               select new ErrorInfo(metaProp.Name, attribute.FormatErrorMessage(string.Empty), instance);
    }
}

MVC 2

La validación en Asp.net MVC 2 Beta 2 es similar a lo que hace xVal. Por lo tanto, si no está demasiado involucrado en el proyecto y puede considerar el uso de código en el progreso del desarrollo como su base, tal vez ese sea el camino a seguir para usted.

Creo que xVal es genial, lo he estado usando con Castle Validators y funciona perfectamente. Solo captura la excepción RulesException cuando estés ejecutando la validación y agrega los errores a tu ModelState, por ejemplo,

try
{
  // execute validation runner
}
catch (RulesException ex)
{
   ex.AddModelStateErrors(ModelState, "prefix");
}

ASP.NET MVC v2 presentará su propio marco de validación .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top