重定向前设置Viewbag


122

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

我想要类似的东西:

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

Answers:


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为空(在我的情况下,只有在进行转换时才收到一条消息)。因此,我必须进行测试if(TempData [“ Message”]!= null)以避免错误。
帕特里克

1
如果重定向到其他控制器怎么办?在另一个控制器的操作中,ViewBag,TempData和Session均为空!
安德鲁(Andrew)

1
@ Andrew,TempData与特定的控制器无关。也许您进行了多个重定向,并丢失了TempData?您可以链接到一个新的问题与一些代码...
拉斐尔奥尔索斯

我试图在过滤器属性的OnAuthorize方法中设置这些参数,但是没有用,所以我最终使用查询字符串传递数据。另一种方法是,当我稍后需要在filter属性中读取该参数时,在控制器中设置TempData即可。谢谢!
安德鲁(Andrew)

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作为替代:

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

然后在需要时调用它。

更新

另外,正如@James在他的评论中所说,使用该特定会话后,可以将其无效或清除,以避免不必要的垃圾数据或过时的值。


4
我不同意这一点。不要为此使用会话。
Mahmoodvcs 2014年

2
这是另一种选择。在某些情况下更可取。
csharpforevermore

会话变量对于需要跟踪多个帖子/获取之间的事情很有用。对于这样的一次性使用,您必须记住要清除它,否则以后将是垃圾数据,在某些屏幕上显得多余,甚至在上下文之外触发逻辑。
詹姆斯

@James正是这样,在某些情况下,我需要使用这种方法。对于此类情况,必须在使用后取消或清除其值。
乔恩·P
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.