Hallo Zusammen, ich habe einige Validatoren für MVC Modelle geschrieben. In einem Fall möchte ich den zu validierenden Wert aber auch manipulieren und geändert in den Modelmember zurückschreiben.
Vieleicht hat einer von Euch eine gute Idee ob und wenn ja wie das zu bewerkstelligen ist ?
1.) Alle Properties ermitteln 2.) über das ergebnis iterieren und nach dem Attribute suchen. 3.) Wert aus dem Attribute auslesen und auf das Property setzen.
var foo = new Foo { FirstName = "Max", LastName = "Mustermann" }; var type = foo.GetType();
var fooProperties = type.GetProperties(); foreach (var propertyInfo in fooProperties) { var attribute = (ValidationAttribute) Attribute.GetCustomAttribute(propertyInfo, typeof(ValidationAttribute)); if (attribute != null) { propertyInfo.SetValue(foo, attribute.Value, null); } }
Dabei ist nur die Eigenschaft "LastName" mit dem Attribut (ValidationAttribute) annotiert.
Mann muss noch folgendes beachten: wenn ein Modelmember (z.B. wie oben aufgezeigt) gändert wurde und das Model im Controller an die View übergeben wird,dann wird der neue Wert noch nicht von Razor gerendert, weil der Wert im ModelStateDictionary noch der alte ist.
Lösungsmöglichkeit:
public static void RefreshModelValue(this ModelStateDictionary modelState, string key, string attemptedValue) { modelState.SetModelValue(key, new ValueProviderResult(attemptedValue, attemptedValue, CultureInfo.CurrentUICulture)); }