2010-04-06 19 views
14

sto usando modello personalizzato legante in ASP.NET MVC 2 che assomiglia a questo:Impostazione dei valori ModelState nel modello personalizzato raccoglitore

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

Quando torno da questo legante in azione di controllo, il mio oggetto di business che è fornito come parametro per l'azione è correttamente alterato (le linee obj.Created = .... lavoro).

Tuttavia, ModelState non viene aggiornato. Lo so perché ho Richiesto sulla proprietà Slug dell'oggetto commerciale e sebbene abbia modificato ModelStateDictionary nel mio modello personalizzato, fornendo un Slug (come si può vedere sopra), ModelState.IsValid è ancora falso.

Se metto ModelState ["Slug"] nella mia finestra di controllo nella sessione di debug, dice che ha errori (1), quindi apparentemente è vuoto e in quanto tale non funziona.

Come è possibile modificare correttamente ModelState all'interno del codice del raccoglitore modello personalizzato?

risposta

19

Apparentemente non c'è modo di riconvalidare ModelState dopo aver modificato un valore di qualche chiave. IsValid rimane falso perché l'impostazione di un nuovo valore su una chiave non attiva la riconvalida.

La soluzione consiste nel rimuovere prima la chiave che ha attivato IsValid come falso, ricrearlo e assegnarvi il valore. Quando lo fai, ModelState si riconvalida automaticamente e se tutto va bene, IsValid restituisce true.

Ti piace questa:

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

La soluzione deve essere appiccicoso a StackOverflow. Ho cercato e sperimentato alti e bassi fino a quando ho trovato questo tuo. Ti garantisco, non molte persone sanno di questo trucco. Hai salvato i miei giorni! Grazie! – Stack0verflow

+0

Ho provato la soluzione, e ha funzionato in qualche modo per la mia situazione. Puoi dare un'occhiata alla mia domanda su http://stackoverflow.com/questions/23145780/asp-net-mvc-4-how-to-validate-my-model-in-a-custom-model-binder? Grazie! – Stack0verflow

Problemi correlati