2010-04-06 8 views
14

używam niestandardowych modelu spinacza w ASP.NET MVC 2, który wygląda tak:ustawiania wartości w ModelState zwyczaj modelu spoiwa

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)); 
... 

Kiedy wrócę z tego spoiwa do działania kontrolera, mój obiekt biznesowy podany jako parametr akcji jest poprawnie zmieniony (linie obj.Created = .... work).

Jednak modelStateState nie jest aktualizowany. Wiem o tym, ponieważ mam wymagane dla właściwości Slug mojego obiektu biznesowego i chociaż zmieniłem ModelStateDictionary w moim segregatorze niestandardowego modelu, zapewniając Slug do niego (jak widać powyżej), ModelState.IsValid jest wciąż fałszywa.

Jeśli umieściłem ModelState ["Slug"] w moim oknie Watch w sesji Debugowania, oznacza to, że ma błędy (1), więc najwyraźniej jest puste i jako takie zawiedzie.

Jak poprawnie zmienić ModelState wewnątrz niestandardowego kodu spoiwa modelu?

Odpowiedz

19

Wygląda na to, że nie ma możliwości ponownego potwierdzenia elementu ModelState po zmianie wartości jakiegoś klucza. Wartość IsValid pozostaje fałszywa, ponieważ ustawienie nowej wartości dla jakiegoś klucza nie powoduje ponownego zatwierdzenia.

Rozwiązaniem jest usunięcie klucza, który spowodował, że IsValid ma wartość false, a następnie odtworzenie i przypisanie do niego wartości. Kiedy to zrobisz, ModelState automatycznie ponownie się uwierzytelni i jeśli wszystko będzie dobrze, IsValid zwróci true.

Jak to:

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

Twoje rozwiązanie musi być lepki w stackoverflow. Szukałem i eksperymentowałem wysoko i nisko, dopóki nie znalazłem tego twojego. Gwarantuję, że niewiele osób wie o tej sztuczce. Uratowałeś moje dni! Dziękuję Ci! – Stack0verflow

+0

Próbowałem twojego rozwiązania, i to działało w mojej sytuacji. Czy możesz rzucić okiem na moje pytanie na http://stackoverflow.com/questions/23145780/asp-net-mvc-4-how-to-validate-my-model-in-a- custom-modular-binder? Dziękuję Ci! – Stack0verflow

Powiązane problemy