Ein geändertes ViewModel innerhalb einer Controller-Methode erneut validieren?
-
27-10-2019 - |
Frage
BEARBEITEN - Wir verwenden MVC4 Dev Preview ....
Ich implementiere eine Bearbeitungsseite für eine FishingTrip
-Klasse. FishingTrip
enthält eine untergeordnete Sammlung einfacher Crew
-Objekte (d. h. FishingTripID, CrewID, CrewPosition).
Ich verwende Jarrett Meyers Ansatz zum Hinzufügen, Bearbeiten und Löschen aus der Crew
-Sammlung.
Ich verwende eine unauffällige Validierung, um anzugeben, dass die Eigenschaften von Crew
alle Required
sind.
Lösung
Wenn Sie die fehlerhaften Elemente entfernt haben, löschen Sie den ModelState und validieren Sie ihn erneut wie folgt:
ModelState.Clear();
TryValidateModel(crew); // assumes the model being passed is named "crew"
Hinweis : Seien Sie vorsichtig, wenn Sie die TryValidateModel
-Methode verwenden, da diese Methode das verschachtelte Objekt des Modells nicht validiert (wie von @Merenzo erwähnt).
Andere Tipps
Spät zum Spiel, aber trotzdem:
Ich suchte auch nach einer Möglichkeit, das Modell zu validieren, nachdem einige Änderungen daran vorgenommen wurden (genauer gesagt - an den Elementen seiner verschachtelten Sammlung) - und TryValidateModel
funktionierte bei mir nicht, da dies nicht der Fall istverschachtelte Objekte verarbeiten.
Schließlich habe ich mich für einen benutzerdefinierten Modellordner entschieden:
public class MyItemModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(
ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(MyItemModel))
{
MyItemModel item = (MyItemModel)bindingContext.Model;
//do required tweaks on model here
//(I needed to load some additional data from DB)
}
//validation code will be called here, in OnModelUpdated implementation
base.OnModelUpdated(controllerContext, bindingContext);
}
}
für die Modellklasse:
[ModelBinder(typeof(MyItemModelBinder))]
public class MyItemModel : IValidatableObject
{
//...
}