2015-02-24 16 views
5

Ho questo immobile nella mia classe ViewModel:del modello rimane False dopo che è stato impostato True nel controller

public bool AreSimilarEntitiesChecked { get; set; }

Nel mio controller ho impostato il suo valore 'vero' e riprendere la vista con il modello:

model.AreSimilarEntitiesChecked = true; 

return View(model).WithWarning("Check the similar mentors before saving!"); 

il mio punto di vista c'è una forma in cui ho messo una nascosta depositata della struttura:

@Html.HiddenFor(m => m.AreSimilarEntitiesChecked) 

Dopo che la vista è tornata con il modello che contiene AreSimilarEntitiesChecked, il suo valore rimane False desipre il fatto che ho impostato il valore True nel controller.

Non so cosa possa esserci di sbagliato.

HTML generato:

<input name="AreSimilarEntitiesChecked" id="AreSimilarEntitiesChecked" 
type="hidden" value="False" data-val-required="The AreSimilarEntitiesChecked 
field is required." data-val="true"> 
+0

il codice HTML generato mostra 'value = "False" 'quindi non è impostato su' true'. C'è qualcos'altro nel tuo codice che impedisce di essere impostato, o lo sta riposizionando. –

+0

Stai facendo 'model.AreSimilarEntitiesChecked = true;' nel metodo GET o POST? –

risposta

5

non posso essere sicuro che questo è il problema dalla tua domanda, ma ci avrei scommesso un sacco di soldi che è ...

di ModelState MVC, che mantiene una rappresentazione dei dati del modello della vista, preleva preferibilmente i valori dai dati POST piuttosto che ricavarli da un modello associato. Cioè, se il POST HTTP contenesse un campo chiamato (senza distinzione tra maiuscole e minuscole) AreSimilarEntitiesChecked con il valore False, non importa quale proprietà si imposta su viewmodel durante il rendering di una vista. ModelState preferirà il valore POSTed al valore viewmodel.

Il motivo di questo strano comportamento è, diciamo che si dispone di un campo in cui un utente deve inserire un numero intero e scrive invece "banana". Questo viene inviato al server per la convalida, che fallisce. Vogliamo rendere di nuovo la vista, con "banana" ancora nel campo e un messaggio che non è un numero intero. Ma se la vista rendesse preferenzialmente i dati del viewmodel, ciò non sarebbe possibile, poiché "banana" non è un numero intero e non può essere inserito in quel campo viewmodel. Quindi i valori POST vengono mantenuti.

Ci sono due opzioni per il fissaggio. O si può risolvere il problema per questo settore specifico:

ModelState.Remove("AreSimilarEntitiesChecked"); 

O l'opzione nucleare:

ModelState.Clear(); 

Ulteriori informazioni su questo comportamento qui: http://weblog.west-wind.com/posts/2012/Apr/20/ASPNET-MVC-Postbacks-and-HtmlHelper-Controls-ignoring-Model-Changes

+0

Grazie per la risposta, questo era il problema. – kmarton

+0

Nessun problema. Mi ci sono voluti circa 5 ore per capire la prima volta che l'ho colpito. Stavo postando un modello su un metodo e restituendone uno diverso nella vista, ma si comporta ancora così anche se cambi tipo di modello. Questo mi insegnerà a non usare Post-Redirect-Get, immagino. – ChrisV