Ustaw Viewbag przed przekierowaniem

122

Czy można ustawić ViewBagprzekierowanie przed wywołaniem?

Chcę coś takiego:

@ViewBag.Message="MyMessage";
RedirectToAction("MyAction");
daniel
źródło

Odpowiedzi:

242

Kiedy używasz przekierowania, nie powinieneś używać ViewBag, aleTempData

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
źródło
1
Dlaczego masz @ViewBag, jeśli nie jesteś w widoku?
apkisbossin
6
Chciałbym uzupełnić odpowiedź, ponieważ go używam i napotkałem mały problem, polegający na tym, że dane TempData są z jakiegoś powodu puste (w moim przypadku mam komunikat tylko po dokonaniu konwersji). Musiałem więc wykonać test if (TempData ["Message"]! = Null), aby uniknąć błędu.
Patrick,
1
Co jeśli przekierowanie jest do innego kontrolera? W akcji innego kontrolera ViewBag, TempData i Session są puste!
Andrew,
1
@Zrealizuj dobrze, TempData nie jest powiązany z określonym kontrolerem. Może robisz więcej niż jedno przekierowanie i tracisz TempData? Możesz utworzyć link do nowego pytania z kodem ...
Raphaël Althaus
Próbowałem ustawić je w metiodzie OnAuthorize atrybutu filtru, ale żaden nie działał, więc ostatecznie użyłem ciągu zapytania do przekazania danych. Z drugiej strony ustawienie TempData w kontrolerze działało, gdy później musiałem odczytać to w atrybucie filtru. Dzięki!
Andrew
13

W takiej sytuacji możesz użyć TempData. Oto wyjaśnienie dotyczące ViewBag, ViewData i TempData.

laszlokiss88
źródło
8

Podobało mi się to ... i działa dla mnie ... tutaj zmieniam hasło i po pomyślnym zakończeniu chcę ustawić komunikat o powodzeniu, aby wyświetlić torbę wyświetlaną na widoku ...

    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
źródło
3

Zaczerpnięte stąd

Podsumowanie

Obiekty ViewData i ViewBag umożliwiają dostęp do tych dodatkowych fragmentów danych, które są powiązane z modelem, jednak w przypadku bardziej złożonych danych można przejść do ViewModel. Z drugiej strony TempData jest specjalnie przystosowany do pracy z danymi w przekierowaniach HTTP, więc pamiętaj, aby zachować ostrożność podczas korzystania z TempData.

Paul Zahra
źródło
-2

Lub możesz użyć sesji jako alternatywy:

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

a potem zadzwoń, kiedy tylko potrzebujesz.

AKTUALIZACJA

Ponadto, jak powiedział @James w swoim komentarzu, bezpieczne byłoby anulowanie lub wyczyszczenie wartości tej konkretnej sesji po jej użyciu, aby uniknąć niechcianych niepotrzebnych danych lub nieaktualnej wartości.

Jon P
źródło
4
Nie zgadzam się z tym. nie używaj do tego sesji.
Mahmoodvcs
2
To jest alternatywa. Jest to preferowane w pewnych sytuacjach.
csharpforevermore
Zmienne sesji są przydatne w przypadku rzeczy, które musisz śledzić między kilkoma postami / pobraniami. W przypadku takiego jednorazowego użycia MUSISZ pamiętać, aby go wyczyścić, w przeciwnym razie będą to niepotrzebne dane, pojawiające się niechciane na jakimś ekranie, a nawet uruchamiające logikę poza kontekstem.
James
@James Dokładnie, to właśnie robię w niektórych przypadkach, gdy potrzebuję tego podejścia. Zniweczenie lub wyczyszczenie jego wartości po użyciu jest koniecznością w takich przypadkach.
Jon P,