Imposta Viewbag prima del reindirizzamento


122

È possibile impostare ViewBagprima di chiamare un reindirizzamento?

Voglio qualcosa come:

@ViewBag.Message="MyMessage";
RedirectToAction("MyAction");

Risposte:


242

Quando usi il reindirizzamento, non devi usare ViewBag, maTempData

public ActionResult Action1 () {
 TempData["shortMessage"] = "MyMessage";
 return RedirectToAction("Action2");
}

public ActionResult Action2 () {
 //now I can populate my ViewBag (if I want to) with the TempData["shortMessage"] content
  ViewBag.Message = TempData["shortMessage"].ToString();
  return View();
}

1
Perché hai @ViewBag se non sei nella visualizzazione?
apkisbossin

6
Vorrei completare la risposta perché lo sto usando e ho riscontrato un piccolo problema che è quando il TempData è vuoto per qualche motivo (nel mio caso ho solo un messaggio quando viene effettuata una conversione). Quindi ho dovuto fare il test if (TempData ["Message"]! = Null) per evitare un errore.
Patrick

1
Cosa succede se il reindirizzamento è su un altro controller? Nell'azione dell'altro controller ViewBag, TempData e Session sono tutti vuoti!
Andrew

1
@Andrew bene, TempData non è correlato a un controller specifico. Forse fai più di un reindirizzamento e perdi TempData? Puoi creare un link a una nuova domanda con un codice ...
Raphaël Althaus

Stavo cercando di impostare quelli nel metodo OnAuthorize di un attributo di filtro, ma nessuno ha funzionato, quindi ho finito per utilizzare la stringa di query per passare i dati. Al contrario, l'impostazione di TempData nel controller ha funzionato quando in seguito ho avuto bisogno di leggerlo nell'attributo del filtro. Grazie!
Andrew,

13

È possibile utilizzare TempData in questa situazione. Ecco alcune spiegazioni per ViewBag, ViewData e TempData.


8

Mi è piaciuto .. e sta funzionando per me ... qui sto cambiando la password e in caso di successo voglio impostare il messaggio di successo nella viewbag da mostrare in vista ..

    public ActionResult ChangePass()
    {
        ChangePassword CP = new ChangePassword();
        if (TempData["status"] != null)
        {
            ViewBag.Status = "Success";
            TempData.Remove("status");
        }
        return View(CP);
    }

    [HttpPost]
    public ActionResult ChangePass(ChangePassword obj)
    {
        if (ModelState.IsValid)
        {
            int pid = Session.GetDataFromSession<int>("ssnPersonnelID");
            PersonnelMaster PM = db.PersonnelMasters.SingleOrDefault(x => x.PersonnelID == pid);

            PM.Password = obj.NewPassword;
            PM.Mdate = DateTime.Now;
            db.SaveChanges();

            TempData["status"] = "Success";
            return RedirectToAction("ChangePass");
        }

        return View(obj);
    }

3

Preso da qui

Sommario

Gli oggetti ViewData e ViewBag offrono modi per accedere a quei pezzi di dati aggiuntivi che vanno a fianco del tuo modello, tuttavia per dati più complessi, puoi passare al ViewModel. TempData, d'altra parte, è progettato specificamente per lavorare con i dati sui reindirizzamenti HTTP, quindi ricorda di essere cauto quando usi TempData.


-2

Oppure puoi usare Session come alternativa:

Session["message"] = "MyMessage";
RedirectToAction("MyAction");

e poi chiamalo quando ne hai bisogno.

AGGIORNARE

Inoltre, come ha detto @James nel suo commento, sarebbe sicuro annullare o cancellare il valore di quella specifica sessione dopo averla utilizzata per evitare dati indesiderati o valori obsoleti.


4
Non sono d'accordo su questo. non usare la sessione per questo.
Mahmoodvcs

2
È un'alternativa. È preferibile in determinate situazioni.
csharpforevermore

Le variabili di sessione sono utili per le cose di cui hai bisogno per tenere traccia tra diversi post / get. Per un utilizzo una tantum come questo, DEVI ricordarti di cancellarlo, altrimenti saranno dati spazzatura in un secondo momento, appariranno indesiderati su alcuni schermi o addirittura innesceranno la logica fuori contesto.
James

@ James Esattamente, questo è quello che faccio per alcuni casi ho bisogno di usare questo approccio. Annullare o cancellare il suo valore dopo l'uso è un must per casi come questi.
Jon P
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.