Odpowiedzi:
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();
}
W takiej sytuacji możesz użyć TempData. Oto wyjaśnienie dotyczące ViewBag, ViewData i TempData.
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);
}
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.
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.