2011-01-31 14 views
8

Si tratta di un'azione di controllo che io chiamo con il metodo ajax postale:Come aggiornare ModelState?

[HttpPost] 
    public ActionResult Add(Comment comment) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      comment.Username = User.Identity.Name; 
      comment.Email = Membership.GetUser().Email; 
     } 

     if (ModelState.IsValid) 
     { 
      this.db.Add(comment); 
      return PartialView("Comment", comment); 
     } 
     else 
     { 
      //... 
     } 
    } 

Se l'utente è connesso, presentare il modulo non ha Nome Utente e-mail i campi, in modo che non viene passato dalla chiamata AJAX . Quando l'azione viene chiamata ModelStat.IsValid restituisce false, poiché queste due proprietà sono obbligatorie. Dopo aver impostato valori validi sulle proprietà, come posso attivare la convalida del modello per aggiornare ModelState?

risposta

4

È possibile utilizzare un costume model binder di impegnare la del commento Utente e-mail oggetti di User.Identity. Poiché l'associazione si verifica prima della convalida, ModelState sarà quindi valido.

Un'altra opzione consiste nell'implementare un valore personalizzato model validator per la classe Commento, che controlla lo ControllerContext.Controller per un utente convalidato.

Implementando una di queste opzioni è possibile rimuovere il primo se il controllo.

+0

Temevo che sarebbe arrivato a quello. Qualche altra soluzione? – frennky

+1

Non aver paura, quelle sono le soluzioni più pulite, le "più MVC". Applicandoli imparerai un po 'di più sul framework con cui stai lavorando. – m0sa

+0

Sì, lo so. Stavo solo saltellando per renderlo semplice. Ho implementato il modello personalizzato, in questo modo ho mantenuto la convalida. Grazie per avermi indicato nella giusta direzione. – frennky

3

È possibile provare a chiamare il metodo integrato TryUpdateModel che restituisce un valore booleano in modo da poter controllare tale valore.

AGGIORNAMENTO: provare a utilizzare TryUpdateModel con le eccezioni. Usa una raccolta di form anziché un commento nell'azione.

[HttpPost] 
    public ActionResult Add(FormCollection collection) 
    { 

     string[] excludedProperties = new string[] { "Username". "Email" }; 
     var comment = new Comment(); 
     if (User.Identity.IsAuthenticated) 
     { 
      comment.Username = User.Identity.Name; 
      comment.Email = Membership.GetUser().Email; 
     } 

     TryUpdateModel<Comment>(comment, "", null, excludedProperties, collection.ToValueProvider()); 

     if (ModelState.IsValid) 
     { 
      this.db.Add(comment); 
      return PartialView("Comment", comment); 
     } 
     else 
     { 
      //... 
     } 
    } 
+0

No, è la prima cosa che ho provato e tutti gli altri metodi in un controller: UpdateModel, ValidateModel, TryValidate. Nessuna di queste funzioni, ottengo un'eccezione: il modello non può essere aggiornato/convalidato o somthing simile. – frennky

+0

In tal caso, perché non utilizzare un ViewModel? Questo comprenderà tutte le proprietà che passi all'azione e non dovrai preoccuparti di quelle mancanti. – Jon

+0

Prova un viewmodel o prova il suggerimento aggiornato nella mia risposta – Jon