Установить 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 02 дек.15,
6
Я хотел бы закончить ответ, потому что я использую его, и я столкнулся с небольшой проблемой, когда TempData по какой-то причине пуста (в моем случае у меня есть сообщение только при выполнении преобразования). Поэтому мне пришлось пройти тест if (TempData ["Message"]! = Null), чтобы избежать ошибки.
Патрик
1
Что делать, если перенаправление на другой контроллер? В действии другого контроллера ViewBag, TempData и Session пусты!
Эндрю
1
@Andrew ну, TempData не связана с конкретным контроллером. Может быть, вы сделаете более одного перенаправления и потеряете TempData? Вы можете добавить ссылку на новый вопрос с некоторым кодом ...
Рафаэль Альтхаус
Я пытался установить их в методе OnAuthorize атрибута filter, но ни один из них не работал, поэтому в итоге я использовал строку запроса для передачи данных. Наоборот, установка TempData в контроллере работала, когда мне позже понадобилось прочитать это в атрибуте фильтра. Спасибо!
Эндрю
13

В этой ситуации вы можете использовать TempData. Вот некоторые объяснения для ViewBag, ViewData и TempData.

laszlokiss88
источник
8

Мне это понравилось ... и это работает для меня ... здесь я меняю пароль, и в случае успеха я хочу установить сообщение об успешном выполнении для отображения в окне просмотра ..

    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 Именно это я и делаю в некоторых случаях, когда мне нужно использовать этот подход. Обнуление или очистка его значения после использования является обязательным условием для подобных случаев.
Jon P