Встановіть Viewbag перед перенаправленням


122

Чи можна встановити ViewBagперед тим, як викликати переадресацію?

Я хочу щось подібне:

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

Відповіді:


242

Коли ви використовуєте перенаправлення, ви не будете використовувати ViewBag, алеTempData

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
Чому у вас @ViewBag, якщо ви не переглядаєте?
apkisbossin

6
Я хотів би доповнити відповідь, тому що я її використовую, і я зіткнувся з невеликою проблемою, яка є, коли TempData чомусь порожній (у моєму випадку у мене є повідомлення лише тоді, коли здійснюється конверсія). Тому мені довелося пройти тест, якщо (TempData ["Повідомлення"]! = Null), щоб уникнути помилки.
Патрік

1
Що робити, якщо перенаправлення на інший контролер? У дії іншого контролера ViewBag, TempData та Session всі порожні!
Андрій

1
@Andrew добре, TempData не пов'язаний з конкретним контролером. Можливо, ви зробите не одне перенаправлення і втратите TempData? Ви можете зв’язати нове запитання з деяким кодом ...
Рафаель Алтаус

Я намагався встановити ті, що знаходяться в метіоді OnAuthorize атрибута фільтра, але жоден не спрацював, тому я в кінцевому підсумку використовував рядок запиту для передачі даних. Навпаки, встановлення TempData в контролері працювало, коли мені пізніше потрібно було прочитати це в атрибуті фільтра. Дякую!
Андрій

13

Ви можете використовувати TempData в цій ситуації. Ось декілька пояснень для ViewBag, ViewData та TempData.


8

Мені це сподобалось .. і його робота для мене працює ... тут я змінюю пароль і на успіх хочу встановити повідомлення про успіх в viewbag, щоб відобразити на погляд ..

    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

Взято звідси

Підсумок

Об'єкти ViewData та ViewBag дають вам спосіб отримати доступ до тих зайвих фрагментів даних, які йдуть поряд із вашою моделлю, однак для складніших даних ви можете перейти до ViewModel. TempData, з іншого боку, орієнтована спеціально на роботу з даними про перенаправлення HTTP, тому не забудьте бути обережними під час використання TempData.


-2

Або ви можете використовувати сесію для альтернативи:

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

а потім телефонуйте, коли вам потрібно.

ОНОВЛЕННЯ

Крім того, як те, що сказав @James у своєму коментарі, було б безпечно звести нанівець чи очистити значення конкретного сеансу після його використання, щоб уникнути небажаних непотрібних даних або застарілих значень.


4
Я не згоден з цим. не використовуйте для цього сеанс.
Mahmoodvcs

2
Це альтернатива. Краще в певних ситуаціях.
csharpforevermore

Змінні сесії корисні для речей, за якими потрібно відстежувати між декількома публікаціями / запитами. Для одноразового використання, подібного до цього, Ви повинні пам'ятати, щоб очистити його, інакше пізніше вони з’являться непотрібними даними, з'являться небажаними на якомусь екрані або навіть запускають логіку поза контекстом.
Джеймс

@James Саме так я роблю для деяких випадків, коли мені потрібно використовувати цей підхід. Зменшення або очищення його вартості після використання є обов'язковим для таких випадків.
Джон Р
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.