2012-06-12 19 views
7

Quindi ho un ViewBag.Something e questi dati sono generati casualmente. A mio avviso, l'ho impostato su un'etichetta come @Html.LabelFor(m => m.Something, (string)ViewBag.Something). Funziona bene ma quando invio il modulo ci possono essere errori e se ci sono errori, ho bisogno che questa etichetta rimanga la stessa, non voglio più dati dinamici/casuali, quindi non chiamerei il metodo controller che ha generato questo ViewBag. C'è un modo per mantenere questo valore senza avere qualche variabile privata nel mio controller? Qualche modo carino con MVC/Razor?Come possono essere salvati i dati ViewBag dopo un modulo?

risposta

1

In get, impostare un modello, impostarlo in modo dinamico e quando return view() viene eseguito, fare return view(model). Quindi, nella vista, imposta un campo nascosto che può continuare a trasmettere il valore necessario. Ho scelto di seguire questa strada perché non devo preoccuparmi di alcun codice server per far funzionare questo lavoro su un post e non devo preoccuparmi di alcuna sessione.

+0

Questo ha un problema di sicurezza. Se qualcuno ispeziona il codice, sarà in grado di ottenere o persino modificare i dati ... E se fosse un oggetto? – Nick

12

Opzione 1:

passare il valore di "ViewBag.Something" al controller utilizzando i valori di percorso:

@Html.ActionLink("ButtonText", "ActionName", new { Something = @ViewBag.Something }) 

Opzione 2: È possibile utilizzare TempData.

public ActionResult Index() 
{ 
var Something = "YOURVALUE"; 
TempData["Something"] = Something; 
....... 
} 


public ActionResult OtherAction() 
{ 
    var Something = TempData["Something "]; 
    ........... 
} 

Passando Stato tra i metodi di azione

metodi azione potrebbe essere necessario trasmettere dati a un'altra azione, ad esempio se si verifica un errore quando un form viene inviata, oppure se il metodo deve reindirizzare a ulteriori metodi, come potrebbe accadere quando l'utente viene indirizzato a una vista di accesso e quindi al metodo di azione originale.

Un metodo di azione può memorizzare i dati nell'oggetto TempDataDictionary del controller prima che invochi il metodo RedirectToAction del controller per richiamare l'azione successiva. Il valore della proprietà TempData è memorizzato nello stato della sessione. Qualsiasi metodo di azione chiamato dopo aver impostato il valore TempDataDictionary può ottenere valori dall'oggetto e quindi elaborarli o visualizzarli. Il valore di TempData persiste finché non viene letto o fino a quando la sessione scade. Tempdata persistente in questo modo abilita scenari come il reindirizzamento, poiché i valori in TempData sono disponibili oltre una singola richiesta.

+0

quindi mi sarebbe memorizzare ViewBag.Something in un TempData quando ho colpito inviare e se qualcosa va storto, sarà disponibile per l'uso? Questo potrebbe creare problemi perché la mia etichetta viene popolata da ViewBag e immagino che ora avrò bisogno di una sorta di if? – Pittfall

+0

Vedere il mio aggiornamento per un'altra opzione che è possibile provare. –

+0

Grazie per l'aiuto, sembra buono ma sono andato in una direzione diversa, quindi non posso accettare la tua risposta – Pittfall

-1

Visualizzazione messaggio nel viewbag dopo la pubblicazione (I utente questo metodo)

ActionResult SubmitUser(){ 

    ViewBag.Msg =TempData["Msg"]; 

    return view(); 
} 


[HtttpPost] 
ActionResult SubmitUser(){ 

TempData["Msg"] ="Submitted Successfully"]; 

    return view(); 
} 

il valore è inviare per ottenere metodo ..

Problemi correlati