Meilleure pratique de validation d'entité dans ASP.NET MVC & ADO.NET Entity Framework

.net asp.net-mvc entity-framework validation

Question

J'utilise ASP.NET MVC et ADO.NET Entity Framework dans un projet. Je souhaite ajouter une logique de validation à mes entités via des classes partielles. Cela fonctionne comme dans l’ application ASP.NET MVC de NerdDinner.com qui utilise LINQ2SQL. La principale différence est que je dois utiliser l'événement "OnPropertyChanging" à la place de "OnValidating" comme dans LINQ2SQL.

Cette procédure pose certains problèmes: - L'événement "OnPropertyChanging" n'est pas le point optimal pour appeler la logique de validation, car il se déclenche toujours, même lors de la création d'un appel du constructeur par défaut. Cela peut causer de graves problèmes (pas uniquement des problèmes de performances). - En même temps que le framework MVC, l'utilisation de "EntityState.Detached" (je ne pouvais trouver aucun autre moyen) pour déterminer si une entité doit être validée ou non est problématique. Parce qu'une entité perd son statut lors de son affichage dans la vue (car lors de l'événement POST, un nouvel objet entité est créé au lieu de renvoyer l'objet d'origine).

Ma question est la suivante: existe-t-il un meilleur moyen d’ajouter une validation aux entités ADO.NET? Je n'ai trouvé aucun didacticiel utilisant un moyen pratique d'ajouter une validation aux entités ADO.NET.

Réponse populaire

Personnellement, je ne mets pas de validation dans les objets eux-mêmes. J'utilise la bibliothèque xVal pour gérer la validation de mon entité.

xVal vous encourage à annoter vos classes d'entité (ou, en fait, les classes d'accompagnement de métadonnées) avec des attributs décrivant les différentes règles de validation. Ces attributs de validation sont ceux par défaut fournis avec .NET dans System.ComponentModel.DataAnnotations.

Vous exécutez ensuite manuellement la validation sur vos objets dans votre couche de gestion. Pour ce faire, utilisez une méthode qui exécute la logique de validation System.ComponentModel.DataAnnotations. J'ai écrit un qui ressemble à ceci:

/// <summary>
/// Gets the validation errors for the passed in object by using reflection to retrieve the 
/// <see cref="ValidationAttribute"/>s placed on its properties or on the properties of the object's
/// metadata class (as specified by a <see cref="MetadataTypeAttribute"/> placed on the object's class)
/// </summary>
/// <param name="instance">The object to validate</param>
/// <returns>Any validation errors</returns>
/// <remarks>
/// Borrowed (and cleaned up) from
/// http://goneale.com/2009/03/04/using-metadatatype-attribute-with-aspnet-mvc-xval-validation-framework/
/// </remarks>
public static IEnumerable<ErrorInfo> Validate(object instance)
{
    //Try to get the MetadataType attribute from the object
    MetadataTypeAttribute metadataAttrib = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();

    //If the MetadataType attribute existed, get the metadata class
    //else just use the class of the object
    Type buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : instance.GetType();

    IEnumerable<PropertyDescriptor> buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass).Cast<PropertyDescriptor>();
    IEnumerable<PropertyDescriptor> modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();

    //This query matches each property on the model class against the buddy class
    //gets a list of all invalid validation attributes and returns a list of
    //validation errors
    return from buddyProp in buddyClassProperties
           join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name
           from attribute in buddyProp.Attributes.OfType<ValidationAttribute>()
           where !attribute.IsValid(modelProp.GetValue(instance))
           select new ErrorInfo(buddyProp.Name, attribute.FormatErrorMessage(String.Empty), instance);
}

xVal fournit un type d'exception soigné que vous pouvez générer, qui encapsule les erreurs de validation et vous permet de les ajouter facilement à ModelState dans votre contrôleur.

xVal générera également automatiquement le code de validation de formulaire JavaScript côté client en exploitant jQuery.Validate en fournissant une méthode HtmlHelper.

Consultez http://blog.codeville.net/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/ pour une présentation de son fonctionnement. J'ai trouvé que c'était un très bon moyen de valider une validation qui n'était pas une corvée totale. Cela s'inscrit parfaitement dans la manière de faire des choses ASP.NET MVC.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow