Die MVC-Validierung Framework
-
05-07-2019 - |
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)
Lösung
Haben Sie sich bei der Validierung in der Beta 2?
http://blogs.msdn.com/rickandy/archive/2009/10/03/client-side-validation-for-mvc-2-p2.aspx
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.