2010-01-28 8 views
5

Sto cercando di creare una soluzione alternativa nel mio controller che gestisca un bug in ASP.NET MVC v1. Il bug si verifica se pubblichi una listbox che non ha selezionato nulla (http://forums.asp.net/p/1384796/2940954.aspx).Se una chiave non esiste in ModelState, come posso aggiungerla? aspnetmvc1

Spiegazione rapida: Ho un rapporto che accetta due date da caselle di testo e una o più selezioni da un ListBox. Tutto funziona tranne la convalida se la lista non viene lasciata selezionata.

Quando il modulo posta e raggiunge il mio controller, il modello contiene tutti gli elementi necessari. Tuttavia, ModelState non contiene una chiave/valore per la casella di riepilogo. Per risolvere, speravo qualcosa di simile sarebbe fare il trucco:

if (!ModelState.ContainsKey("TurnTimeReportModel.Criteria.SelectedQueuesList") || ModelState["TurnTimeReportModel.Criteria.SelectedQueuesList"] == null) { 
      ModelState.Keys.Add("TurnTimeReportModel.Criteria.SelectedQueuesList"); 
      ModelState["TurnTimeReportModel.Criteria.SelectedQueuesList"].Equals(new List<string>()); 
     } 

Sfortunatamente, questo getta la seguente eccezione quando provo ad aggiungere la chiave: System.NotSupportedException: La modifica dei dettagli la consegna delle chiavi derivato da un dizionario non è permesso.

Qualche idea?

Grazie in anticipo!

risposta

2

ho finito per andare con la seguente, che ha fatto il trucco:

  if (ModelState.ContainsKey("TurnTimeReportModel.Criteria.SelectedQueuesList") && ModelState["TurnTimeReportModel.Criteria.SelectedQueuesList"] == null) { 
      ModelState["TurnTimeReportModel.Criteria.SelectedQueuesList"].Value = new ValueProviderResult("", "", CultureInfo.CurrentUICulture); 
     } else if (!ModelState.ContainsKey("TurnTimeReportModel.Criteria.SelectedQueuesList")) { 
      ModelState.Add("TurnTimeReportModel.Criteria.SelectedQueuesList", new ModelState{Value = new ValueProviderResult("","",CultureInfo.CurrentUICulture)}); 
     } 
4

utilizzare il metodo ModelState.Add direttamente:

ModelState.Add("TurnTimeReportModel.Criteria.SelectedQueuesList", 
       new ModelState{ AttemptedValue = new List<string>() }) 
+0

Grazie per la risposta! Proverò questo e vedrò come si compara in confronto. – BueKoW

+0

Grazie per la buona risposta! Anche questo mi ha aiutato. Stava affrontando questo problema con un controller deriso in un test unitario e questo ha fatto il trucco! – Rob

Problemi correlati