Question

J'ai évalué xVal en tant que cadre pour la validation des entités dans le cadre ASP.Net MVC. J'ai récemment découvert que chaque fois qu'une règle de validation est enfreinte, xVal provoque un excédement. Pour moi, cela semble incorrect. Par exemple, lorsqu'un utilisateur remplit un formulaire et oublie de remplir trois champs obligatoires, trois exceptions sont levées. Est-ce une bonne pratique? (Edit: Je lis aussi ceci , alors je suppose que ce n'est pas une bonne pratique)

Quelles sont vos expériences avec xVal? Existe-t-il un bon cadre de validation alternatif qui ne jette pas d’exceptions?

Merci

(PS: Je remarque que de nombreuses personnes lisent ceci, je tiens à vous informer de j'utilise la validation Fluent <. / a> maintenant)

Autres conseils

Non, ce n'est pas une bonne pratique d'afficher des exceptions au lieu de simples messages car rien ne s'est sérieusement mal passé ... Vous devriez plutôt renseigner ModelState avec ces erreurs et les afficher sur le formulaire à l'aide de

Html.ValidationMessage("EntityPropertyName");

xVal supporte tout cela. En plus de valider côté client avant que le formulaire ne soit renvoyé.

Certains codes

Lorsque vous définissez des attributs DataAnnotations pour vos classes d'entité (ou leurs classes d'accompagnement Metadata), vous implémenterez probablement également la méthode Validate (). Le meilleur moyen serait d’utiliser T4 qui les générera automatiquement, de sorte que vous n’aviez pas à répéter le même code encore et encore ...

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

Il suffit ensuite d'appeler ceci:

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

Et pour automatiser encore plus loin, vous pouvez l'implémenter dans un filtre d'action. Ainsi, la validation sera automatique pour vos objets d'entité qui sont passés dans l'action du contrôleur. Les actions du contrôleur n’auraient besoin que de vérifier si ModelState.IsValid () , alors.

Une autre classe dont vous aurez besoin ici est (et provient du Web quelque part):

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

Validation dans Asp.net MVC 2 La version bêta 2 est similaire à celle de xVal. Donc, si vous n'êtes pas trop avancé dans le projet et que vous pouvez envisager d'utiliser le code en cours de développement comme base, c'est peut-être la voie à suivre pour vous.

Je pense que xVal est excellent, je l'utilise avec Castle Validators et cela fonctionne parfaitement. Attrapez simplement la RuleException chaque fois que vous exécutez une validation et ajoutez les erreurs à votre ModelState, par exemple.

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

ASP.NET MVC v2 présentera son propre cadre de validation .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top