2011-01-29 4 views
41

Ho un processo di importazione di file in più fasi. Ho un input di modulo nascosto nella mia vista che sto cercando di popolare con "CurrentStep" dal modello di visualizzazione.Nascosto per non ottenere il valore corretto dal modello di vista

<% = Html.HiddenFor(model => model.CurrentStep) %> 

CurrentStep è un Enum e ottengo sempre il valore predefinito anziché quello che ho fornito al modello di visualizzazione. d'altra parte questo mi ottiene il valore corretto:

<p><% = Model.CurrentStep %></p> 

mi rendo conto che ho potuto solo codice lato l'input nascosto, ma voglio sapere: che cosa sto sbagliando? C'è un modo migliore per tenere traccia del passaggio attuale tra i POST?

Grazie in anticipo.

+0

Mostraci il codice per il modulo (ad esempio Html.BeginForm()), per favore. –

risposta

62

Quello che si sta facendo male è che si sta tentando di modificare il valore di una variabile POSTed nell'azione del controllore. Quindi suppongo che si sta cercando di fare questo:

[HttpPost] 
public ActionResult Foo(SomeModel model) 
{ 
    model.CurrentStep = Steps.SomeNewValue; 
    return View(model); 
} 

e html aiutanti quali HiddenFor sempre utilizzare prima il valore di iscrizione e dopo che il valore nel modello.

In modo da avere un paio di possibilità:

  1. rimuovere il valore dal ModelState:

    [HttpPost] 
    public ActionResult Foo(SomeModel model) 
    { 
        ModelState.Remove("CurrentStep");    
        model.CurrentStep = Steps.SomeNewValue; 
        return View(model); 
    } 
    
  2. generare manualmente il campo nascosto

    <input type="hidden" name="NextStep" value="<%= Model.CurrentStep %>" /> 
    
  3. Scrivi un costume aiutante che utilizzerà il valore del tuo modello e non quello che è ing Pubblicato

+2

Grazie. Ho pensato che l'intero punto di un modello di vista fosse quello di passare a informazioni complesse (più complesse di quelle che dovrebbero essere contenute in ViewData) alla vista. Quindi la vista non sta usando il modello di vista che sto passando ad esso? Sta ottenendo tutto ciò che c'era nei VAR del POST? Questo non ha molto senso per me. – user427875

+4

Grazie, ottima risposta. Per (1) è anche possibile utilizzare ModelState.Clear() per rimuovere tutti i valori. – tkerwood

+2

@Darin Dimitrov: abbiamo avuto un problema simile e il tuo post ci ha aiutato molto. Ma quello che non otteniamo, e forse tu hai la risposta, è perché lo fa. Perché prende il valore dal POST, anche se apparentemente lo sostituisce con il valore del modello in .cshtml. –

4

La mia soluzione era quella di utilizzare seconda opzione di Darin, perché l'opzione 1 (compensazione da parte dello Stato modello) significa duro codifica una stringa (e la convenzione di denominazione può essere difficile con modelli complessi), e voleva evitare opzione 3 perché ho già così tanti aiutanti personalizzati.

<input type="hidden" name="@Html.NameFor(x => Model.SomeId)" value="@Model.SomeId" />

Solo un promemoria che è possibile utilizzare Html.NameFor per mantenere le cose pulite.

Problemi correlati