2017-02-24 3 views
0

Ich benutze C# MVC 4 serverseitig. Der Zweck von Gerenel auf dieser Seite besteht darin, einige Textinformationen sowie eine vom Benutzer festgelegte Datei einzugeben.MVC 4 automatische Model Validation hängt auf ViewModel mit verschachtelten ViewModel

Daher verwende ich ein ViewModel, das das "Parent" ViewModel ist, das Informationen über die vom Benutzer eingegebenen textuellen Informationen namens FileInformationViewModel enthält. Dieses "übergeordnete" ViewModel enthält ein anderes "untergeordnetes" ViewModel, nennen wir es FileUploadViewModel.

Jedes dieser ViewModels ist vom IValidateObject abgeleitet und besitzt ihre benutzerdefinierte Validate-Funktion, die nur die aktuellen Attribute des Modells validiert. Dies bedeutet, dass das "übergeordnete" ViewModel keine Validierung für das "untergeordnete" ViewModel durchführt, da das "untergeordnete" ViewModel eine eigene spezifische Validierungsfunktion besitzt.

Das "untergeordnete" ViewModel wird über die von MVC 4 angebotene automatische Modellvalidierung validiert, und ModelState wird wie erwartet festgelegt. Danach wird das "untergeordnete" ViewModel erfolgreich an die "übergeordnete" ViewModel by MVC Model Bindungslogik gebunden. Wenn die Validierung für das "untergeordnete" ViewModel fehlschlägt, wird die Validate-Funktion für das "übergeordnete" ViewModel nicht mehr verarbeitet, aber ich würde gerne beide Validierungen behandeln, die bei der Modellbindung automatisiert sind. Gibt es eine Möglichkeit, dies zu erreichen, oder gibt es die einzige Möglichkeit, die ViewModels auf meinem Controller manuell zu validieren?

meine Konstruktion zu veranschaulichen, hier ist die "Eltern" Ansichtsmodell:

public class FileInformationViewModel : IValidatableObject 
{ 
    public FileInformationViewModel() 
    { 
     ViewModel1 = new FileUploadViewModel(); 
    } 

    public FileUploadViewModel ViewModel1 { get; set; } 
    public string InputFieldToBeSet { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (!string.IsNullOrWhiteSpace(InputFieldToBeSet)) 
     { 
      var result = new ValidationResult("Enter some information, please!", new[] { nameof(InputFieldToBeSet) }); 
      yield return result; 
     } 
    } 

Antwort

0

Mit IValidatableObject Validierung Kurzschlüssen. Der erste zurückgegebene Fehler führt dazu, dass die weitere Validierung gestoppt wird. Das sind nur die Pausen des Spiels. Es gibt keinen Weg dahin.

Wenn Sie alle Fehler gleichzeitig benötigen, muss der Modellbinder die Validierung mithilfe von Datenannotationen in den Eigenschaften des Ansichtsmodells übernehmen. Sie können so ziemlich jedes denkbare Szenario auf diese Weise behandeln, da Sie immer Ihre eigenen Validierungsattribute hinzufügen können oder es gibt mehrere Bibliotheken von Validierungsattributen.

+0

Vielen Dank für Ihre schnelle Antwort. In der Tat fragte ich mich, ob ich Datenanmerkungen einfach verwenden könnte, indem ich meine eigenen bei Bedarf erstelle. Aber es gibt eine komplexere Validierung, die ich in der Validierungsfunktion durchführen muss. Es stellte sich heraus, dass ich das "IValidationObject" aus dem SubModel entfernte und stattdessen die Fehler an das übergeordnete Modell zurückgab und die childs-Fehler auf prent level hinzufügte. Trotzdem denke ich, dass Ihr Rat in den meisten Fällen der geeignetste ist. – doodles975