Best-Practice-Entitätsvalidierung in ASP.NET MVC und ADO.NET Entity Framework

.net asp.net-mvc entity-framework validation

Frage

Ich verwende ASP.NET MVC & ADO.NET Entity Framework in einem Projekt. Ich möchte meinen Entitäten über Teilklassen Validierungslogik hinzufügen. Es funktioniert ähnlich wie in der NerdDinner.com ASP.NET MVC-Anwendung, die LINQ2SQL verwendet. Der Hauptunterschied ist, dass ich das Ereignis "OnPropertyChanging" anstelle von "OnValidating" wie in LINQ2SQL verwenden muss.

Auf diese Weise gibt es einige Probleme: - Das Ereignis "OnPropertyChanging" ist nicht der optimale Punkt für den Aufruf von Validierungslogik, da es immer ausgelöst wird, selbst wenn ein Aufruf des Standardkonstruktors erstellt wird. Dies kann ernsthafte Probleme verursachen (nicht nur Leistungsprobleme). - Zusammen mit dem MVC-Framework gibt es Probleme bei der Verwendung von "EntityState.Detached" (ich konnte keinen anderen Weg finden), um festzustellen, ob eine Entität validiert werden muss oder nicht. Da eine Entität ihren Entitätsstatus verliert, während sie in der Ansicht angezeigt wird (da beim POST-event ein neues Entitätsobjekt erstellt wird, anstatt das ursprüngliche zurückzugeben).

Meine Frage ist: Gibt es eine bessere Möglichkeit, ADO.NET-Entitäten Validierung hinzuzufügen? Ich konnte keine Tutorials finden, die eine praktische Methode zum Hinzufügen von Validierungen zu ADO.NET-Entitäten enthalten.

Beliebte Antwort

Persönlich stelle ich keine Bestätigung in die Objekte selbst ein. Ich verwende die xVal- Bibliothek, um meine Entitätsvalidierung durchzuführen .

xVal fordert Sie auf, Ihre Entitätsklassen (oder eigentlich Metadaten-Begleitklassen) mit Attributen zu versehen, die die verschiedenen Validierungsregeln beschreiben. Diese Validierungsattribute sind die Standardattribute, die .NET in System.ComponentModel.DataAnnotations enthalten.

Anschließend führen Sie die Validierung für Ihre Objekte manuell in Ihrer Business-Schicht durch. Dies geschieht mithilfe einer Methode, die die Validierungslogik System.ComponentModel.DataAnnotations ausführt. Ich habe einen geschrieben, der so aussieht:

/// <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 bietet einen übersichtlichen Ausnahmetyp, den Sie werfen können, um Validierungsfehler zu kapseln und diese problemlos zum ModelState in Ihrem Controller hinzuzufügen.

xVal generiert automatisch clientseitigen JavaScript-Formularvalidierungscode, indem Sie jQuery.Validate verwenden, indem Sie eine HtmlHelper-Methode bereitstellen.

Unter http://blog.codeville.net/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/ erfahren Sie, wie es funktioniert. Ich habe festgestellt, dass dies eine sehr schöne Art der Validierung ist, die keine lästige Pflicht ist. Es passt genau in die Vorgehensweise von ASP.NET MVC.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum