Pergunta

Tenho avaliado xVal como estrutura para validar Entidades do ASP.Net MVC Framework. Eu descobri recentemente que cada vez que uma regra de validação é quebrado, xVal causa um excpetion para ser jogado. Para mim é parece incorreta. Por exemplo, quando um usuário preenche um formulário e se esquece de preencher três campos obrigatórios, três exceções será lançada. É esta boa prática? (Edit: Eu também li isso, então eu acho que não é uma boa prática)

Quais são as suas experiências de utilização de xVal? Existe uma boa estrutura de validação alternativa que não lançar exceções?

Graças

(PS: aviso I que muitas pessoas estão lendo isto, apenas para que você saiba Eu estou usando Fluent Validação agora)

Foi útil?

Outras dicas

Não, não é uma boa prática para mostrar exceções em vez de algumas mensagens simples, porque nada sério foi acontecendo de errado ... Você deve ModelState vez preenchido com esses erros e exibi-los no formulário usando

Html.ValidationMessage("EntityPropertyName");

xVal suporta todos estes. Bem como validar no lado do cliente antes que o formulário é postado de volta.

Algum código

Quando você define atributos DataAnnotations às suas classes de entidade (ou suas aulas companheiro de metadados) você provavelmente irá também implementar Validate () método. a melhor maneira seria usar T4 que a vontade auto gerar aqueles para você, então você não tem que repeate o mesmo código mais e mais ...

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

Tudo que você tem que fazer então é chamar isto:

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

E para automatizar ainda mais longe, você pode implementar isso em um filtro de ação, de modo a validação será automática para os seus objetos de entidade que são passadas em ação controlador. ações do controlador só precisa verificar se ModelState.IsValid() então.

Mais uma classe que você precisa aqui é (e é retirado do lugar web):

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

Validação em Asp.net MVC 2 Beta 2 é semelhante ao que xVal faz. Então, se você não está muito longe para o projeto e você pode considerar o uso de código em andamento o desenvolvimento como seu alicerce, talvez isso é o caminho a percorrer para você.

Eu acho xVal é grande, eu tenho usado com Castelo Validators e ele funciona perfeitamente. Apenas pegar o RulesException sempre que você estiver executando validação e adicionar os erros para o seu ModelState, por exemplo.

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

ASP.NET MVC v2 irá apresentar o seu próprio quadro validação .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top