Benutzerdefinierte Validierung mit Datenanmerkungen

asp.net-mvc data-annotations entity-framework

Frage

Ich verwende Datenanmerkungen, um die eingegebenen Daten zu überprüfen, aber ich bin festgefahren, wenn es um mehr benutzerdefinierte Methoden zum Überprüfen von Daten geht.

Ich muss Abfragen für die Datenbank ausführen, um zu sehen, ob dort Zeug vorhanden ist oder nicht, und dann an den Benutzer zu berichten, wenn ein "benutzerdefinierter Db-Check-Fehler" angezeigt wird, z. B. "Der Firmenname ist bereits vorhanden".

Wie kann ich so etwas zusammen mit Datennotationen implementieren?

Ich habe alle Abfragen usw. mit Linq und Entity Framework gemacht, die mit 3.5sp1 geliefert werden

/ M

Akzeptierte Antwort

Benutzerdefinierte Attribute, die Datenanmerkungen erweitern

Sie müssen Ihre eigenen Attribute schreiben, die die Validierung Ihrer Objektinstanz anhand des Datenspeichers durchführen.

Stellen Sie sicher, dass Ihre Klassen die Klasse System.ComponentModel.DataAnnotations.ValidationAttribute erben:

public class MustNotExist: ValidationAttribute
{
    ...
}

Vorsicht

Ich bin in eine ähnliche Situation geraten, als ich feststellen musste, dass das Objekt innerhalb des Datenspeichers eindeutig ist. Diese Art der Überprüfung war jedoch nicht für die Entitätsklasse selbst möglich, da sie nur für die Entitäten funktionieren sollte, die erstellt werden, aber nicht, wenn Sie Ihre Entität bereits aus dem Datenspeicher zurückgeben.

Meine Lösung bestand darin, eine separate Schnittstelle, eine Klasse und ein Attribut zu haben.

public interface IExternalValidator ...

class DBUniqueValidator: IExternalValidator ...

class ValidateExternallyAttribute: FilterAttribute, IActionFilter
{
    ...
    public ValidateExternallyAttribute(Type validatorType, Type entityType) ...
    ...
}

Ich konnte mein Attribut auf Controller-Aktionen setzen, die Entitätsparameter abrufen. Das Filteraktionsattribut überprüft dann die Controller-Aktionsparameter (es kann leicht auf ihre Typen und Werte zugreifen) und führt einen externen Prüfer anhand der korrekten Parameter aus (bei der Attributdefinition angegebene Typen) und füllt ModelState-Fehler auf, wenn die Überprüfung fehlschlägt.

[ValidateExternally(typeof(DBUniqueValidator), typeof(User))]
public ActionResult RegisterUser(User newUser)
{
    if (!this.ModelState.IsValid)
    {
        // act accordingly - probably return some error depending on model state errors
    }
    // register new user in data store
}

Auf diese Weise konnte ich die externe Überprüfung nur für die Aktionen durchführen, die sie tatsächlich benötigten, und diese Technik half auch, dass der Code für meine Controller-Aktionen sauber und kurz bleibt. Alles, was ich tun musste, war zu überprüfen, ob Modellstatusfehler vorliegen.



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