Frage

Ich habe die Bewertung xVal, als Rahmen für die Validierung von Entitäten in der ASP.Net MVC-Framework.Ich habe vor kurzem entdeckt, dass jedes mal, wenn eine Gültigkeitsregel ist gebrochen, xVal bewirken, dass eine Exception geworfen werden.Mir scheint nicht korrekt zu sein.Zum Beispiel, wenn ein Benutzer füllt ein Formular aus, und vergisst zu füllen drei Pflichtfelder , drei Ausnahmen werden geworfen.Ist das eine gute Praxis?( Bearbeiten: Ich habe auch gelesen das, also, ich denke, es ist keine gute Praxis)

Was sind Ihre Erfahrungen mit xVal?Gibt es gute alternativen Validierung Rahmen, der keine exceptions werfen?

Vielen Dank

(PS:Ich merke, dass viele Leute, die dies Lesen, nur um Sie wissen zu lassen Ich bin mit Fluent Validation jetzt)

War es hilfreich?

Lösung

Andere Tipps

Nein, es ist nicht eine gute Praxis, um zu zeigen Ausnahmen statt einige einfache Nachrichten, da nichts ernsthaft schief gelaufen ist...Sie sollten stattdessen füllen ModelState mit diesen Fehlern und zeigt Sie auf dem Formular mit

Html.ValidationMessage("EntityPropertyName");

xVal unterstützt alle diese.Sowie die Validierung auf der client-Seite vor der form wird zurück gebucht.

Code

Wenn Sie DataAnnotations Attribute der entity-Klassen (bzw. deren Metadaten Begleiter Klassen), werden Sie höchstwahrscheinlich auch umzusetzen Validate () - Methode.der beste Weg wäre, die Nutzung T4, die automatisch zu generieren, die für Sie, so dass Sie nicht haben zu wiederholen, der gleiche code, über und über...

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

Alles, was Sie tun müssen, ist zu nennen das:

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

Und zu automatisieren, dies noch weiter, Sie implementieren können, diese in einer action-filter, so dass die Validierung wird automatisch für Ihre entity-Objekte, die übergingen in die controller-Aktion.Controller-Aktionen würden nur noch zu prüfen, ob ModelState.IsValid() dann.

Eine weitere Klasse, die Sie benötigen, hier (ist irgendwo im 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

Validierung Asp.net MVC 2 Beta 2 ist ähnlich zu dem, was xVal tut.Also, wenn Sie nicht zu weit in die Projekt-und Sie können überlegen, mit code in die Entwicklung wie Ihre Stiftung, vielleicht ist das der Weg zu gehen für Sie.

Ich denke, xVal ist toll, ich habe es mit Burg Prüfungen und es funktioniert perfekt.Nur fangen die RulesException, wenn Sie sind laufende Validierung und fügen Sie die Fehler Ihrer ModelState, z.B.

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

ASP.NET MVC v2 stellt seine eigenen validation framework.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top