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.