2010-04-06 12 views
14

Ich bin mit Bindemittel benutzerdefinierte Modell in ASP.NET MVC 2, der wie folgt aussieht:Einstellung Model Werte in benutzerdefinierten Modell Binder

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (controllerContext == null) 
     { 
      throw new ArgumentNullException("controllerContext"); 
     } 
     if (bindingContext == null) 
     { 
      throw new ArgumentNullException("bindingContext"); 
     } 

     BaseContentObject obj = (BaseContentObject)base.BindModel(controllerContext, bindingContext); 
     if(string.IsNullOrWhiteSpace(obj.Slug)) 
     { 
      // creating new object 
      obj.Created = obj.Modified = DateTime.Now; 
      obj.ModifiedBy = obj.CreatedBy = controllerContext.HttpContext.User.Identity.Name; 
      // slug is not provided thru UI, derivate it from Title; property setter removes chars that are not allowed 
      obj.Slug = obj.Title; 
      ModelStateDictionary modelStateDictionary = bindingContext.ModelState; 
      modelStateDictionary.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null)); 
... 

Wenn ich von diesem Bindemittel in Controller-Aktion zurück Objekt, mein Geschäft, das ist als Parameter für die Aktion zur Verfügung gestellt wird korrekt geändert (die Zeilen obj.Created = .... arbeiten).

Der ModelState wird jedoch nicht aktualisiert. Ich weiß das, weil ich Required für die Slug-Eigenschaft meines Geschäftsobjekts habe und obwohl ich ModelStateDictionary in meinem benutzerdefinierten Modellbinder geändert habe, indem ich einen Slug für ihn bereitstelle (wie Sie oben sehen können), ist ModelState.IsValid immer noch falsch.

Wenn ich ModelState ["Slug"] in mein Watch-Fenster in der Debug-Sitzung einfüge, heißt es, dass es Errors (1) hat, also scheinbar leer ist und als solches fehlschlägt.

Wie kann ich den ModelState innerhalb des benutzerdefinierten Modellbindercodes korrekt ändern?

Antwort

19

Anscheinend gibt es keine Möglichkeit, den ModelState erneut zu validieren, sobald Sie einen Wert eines Schlüssels ändern. Das IsValid bleibt falsch, da das Festlegen eines neuen Werts für einen Schlüssel keine Revalidierung auslöst.

Die Lösung besteht darin, zuerst den Schlüssel zu entfernen, der IsValid als false ausgelöst hat, neu zu erstellen und ihm den Wert zuzuweisen. Wenn Sie das tun, wird der ModelState automatisch erneut validiert, und wenn alles in Ordnung ist, gibt IsValid true zurück.

So:

bindingContext.ModelState.Remove("Slug"); 
bindingContext.ModelState.Add("Slug", new ModelState()); 
bindingContext.ModelState.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null)); 
+1

Ihre Lösung muss bei Stackoverflow klebrig sein. Ich habe hoch und niedrig gesucht und experimentiert, bis ich das von dir gefunden habe. Ich garantiere Ihnen, nicht viele Leute kennen diesen Trick. Du hast meine Tage gerettet! Vielen Dank! – Stack0verflow

+0

Ich habe deine Lösung versucht, und es hat irgendwie für meine Situation funktioniert. Könnten Sie sich meine Frage unter http://stackoverflow.com/questions/23145780/asp-net-mvc-4-how-to-validate-my-model-in-a-custom-model-binder ansehen? Vielen Dank! – Stack0verflow

Verwandte Themen