【问题标题】:Set Viewbag before Redirect在重定向之前设置 Viewbag
【发布时间】:2013-01-07 23:52:14
【问题描述】:

是否可以在我调用重定向之前设置ViewBag

我想要类似的东西:

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

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    使用重定向时,不能使用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();
    }
    

    【讨论】:

    • 如果你不在视图中,为什么还要有@ViewBag?
    • 我想完成答案,因为我正在使用它并且我遇到了一个小问题,即 TempData 由于某种原因为空(在我的情况下,我只有在进行转换时才会收到消息)。所以我必须进行测试 if(TempData["Message"] != null) 以避免错误。
    • 如果重定向到其他控制器怎么办?在另一个控制器的action ViewBag中,TempData和Session都是空的!
    • @Andrew 好吧,TempData 与特定控制器无关。也许您做了不止一个重定向,而丢失了 TempData ?您可以使用一些代码链接到一个新问题...
    • @RaphaëlAlthaus 调整您对 `TempData["shortMessage"]?.ToString() 的回答以避免潜在的空引用
    【解决方案2】:

    您可以在这种情况下使用 TempData。 Here 是对 ViewBag、ViewData 和 TempData 的一些解释。

    【讨论】:

      【解决方案3】:

      我确实喜欢这个……它对我有用…… 在这里我正在更改密码,成功后我想将成功消息设置到 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);
          }
      

      【讨论】:

        【解决方案4】:

        Taken from here

        总结

        ViewData 和 ViewBag 对象为您提供了访问模型旁边的额外数据的方法,但是对于更复杂的数据,您可以向上移动到 ViewModel。另一方面,TempData 专门用于处理 HTTP 重定向上的数据,因此请记住在使用 TempData 时要小心。

        【讨论】:

          【解决方案5】:

          或者您可以使用 Session 替代:

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

          然后在需要时调用它。

          更新

          此外,正如@James 在他的评论中所说,在您使用该特定会话后,可以安全地取消或清除它的值,以避免不需要的垃圾数据或过时的值。

          【讨论】:

          • 我不同意这一点。不要为此使用会话。
          • 这是另一种选择。在某些情况下更可取。
          • 会话变量对于您需要在多个帖子/获取之间跟踪的事情很有用。对于像这样的一次性使用,您必须记住将其清除,否则稍后将成为垃圾数据,在某些屏幕上出现不需要的数据,甚至会触发断章取义的逻辑。
          • @James 没错,这就是我在某些需要使用这种方法的情况下所做的。对于此类情况,必须在使用后取消或清除其值。
          猜你喜欢
          • 2010-11-02
          • 2015-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-20
          • 2016-05-19
          • 1970-01-01
          相关资源
          最近更新 更多