Stellen Sie Viewbag vor Redirect ein

122

Ist es möglich, das festzulegen, ViewBagbevor ich eine Umleitung aufrufe?

Ich möchte so etwas wie:

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

Antworten:

242

Wenn Sie die Umleitung verwenden, müssen Sie nicht verwenden ViewBag, aberTempData

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();
}
Raphaël Althaus
quelle
1
Warum haben Sie @ViewBag, wenn Sie nicht in der Ansicht sind?
Apkisbossin
6
Ich möchte die Antwort vervollständigen, weil ich sie verwende und auf ein kleines Problem gestoßen bin, bei dem die TempData aus irgendeinem Grund leer ist (in meinem Fall habe ich nur eine Nachricht, wenn eine Konvertierung durchgeführt wird). Also musste ich den Test if (TempData ["Message"]! = Null) haben, um einen Fehler zu vermeiden.
Patrick
1
Was ist, wenn die Umleitung zu einem anderen Controller erfolgt? In der Aktion ViewBag des anderen Controllers sind TempData und Session alle leer!
Andrew
1
@ Andrew gut, TempData ist nicht auf einen bestimmten Controller bezogen. Vielleicht führen Sie mehr als eine Umleitung durch und verlieren TempData? Sie können mit einem Code auf eine neue Frage verlinken ...
Raphaël Althaus
Ich habe versucht, diese in der OnAuthorize-Metiode eines Filterattributs festzulegen, aber keines hat funktioniert. Daher habe ich die Abfragezeichenfolge zum Übergeben der Daten verwendet. Umgekehrt funktionierte das Festlegen von TempData im Controller, als ich das später im Filterattribut lesen musste. Vielen Dank!
Andrew
13

In dieser Situation können Sie die TempData verwenden. Hier finden Sie einige Erklärungen für ViewBag, ViewData und TempData.

laszlokiss88
quelle
8

Das hat mir gefallen ... und es funktioniert für mich ... hier ändere ich das Passwort und möchte bei Erfolg die Erfolgsmeldung auf viewbag setzen, um sie bei der Anzeige anzuzeigen.

    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);
    }
RAVI VAGHELA
quelle
3

Von hier genommen

Zusammenfassung

Mit den ViewData- und ViewBag-Objekten können Sie auf die zusätzlichen Daten zugreifen, die neben Ihrem Modell vorhanden sind. Bei komplexeren Daten können Sie jedoch zum ViewModel wechseln. TempData hingegen ist speziell auf die Arbeit mit Daten zu HTTP-Weiterleitungen ausgerichtet. Seien Sie daher bei der Verwendung von TempData vorsichtig.

Paul Zahra
quelle
-2

Oder Sie können Session als Alternative verwenden:

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

und rufen Sie es dann an, wann immer Sie es brauchen.

AKTUALISIEREN

Wie @James in seinem Kommentar sagte, ist es außerdem sicher, den Wert dieser bestimmten Sitzung nach ihrer Verwendung aufzuheben oder zu löschen, um unerwünschte Junk-Daten oder veraltete Werte zu vermeiden.

Jon P.
quelle
4
Dem stimme ich nicht zu. Verwenden Sie hierfür keine Sitzung.
Mahmoodvcs
2
Es ist eine Alternative. In bestimmten Situationen ist dies vorzuziehen.
csharpforevermore
Sitzungsvariablen sind nützlich für Dinge, die Sie zwischen mehreren Posts / Gets verfolgen müssen. Bei einer einmaligen Verwendung wie dieser MÜSSEN Sie daran denken, sie zu löschen. Andernfalls handelt es sich später um Junk-Daten, die auf einem Bildschirm unerwünscht erscheinen oder sogar Logik außerhalb des Kontexts auslösen.
James
@ James Genau das mache ich in einigen Fällen, in denen ich diesen Ansatz verwenden muss. In solchen Fällen ist es ein Muss, den Wert nach der Verwendung aufzuheben oder zu löschen.
Jon P