RedirectToAction()破坏字符串数据

时间:2013-03-18 12:26:24

标签: c# asp.net-mvc-3

在我的控制器里面我有字符串变量

private string notificationMessage = "";

我想用它将内容复制到ViewBag.Message并在视图上显示该内容。

因此,在我的编辑操作中,我填充了它的(notificationMessage)内容,如此

notificationMessage = "data is succ. updated!";
return RedirectToAction();

但重定向到Index动作后,此字符串变量为空;

如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

使用TempData代替ViewBag。它在请求之间持续存在。

答案 1 :(得分:3)

这是因为RedirectToAction向浏览器返回HTTP 302响应,这会导致浏览器对指定的操作发出 GET 请求。由于 HTTP是无状态,因此您不能简单地在一个操作中设置内容并将其放入另一个操作中(当它是另一个GET请求时)。

你能做的是

1)将查询字符串传递给您的新操作,并在下一个操作方法中检查并根据该操作显示消息。

return RedirectToAction("ThankYou","Account",new {msg="success"});

并在你的ThankYou行动中

public ActionResult ThankYou(string msg)
{
  var vm=YourSuccessViewModel();
  if(msg="success") // you may do a null checking before accessing this value
  {
    vm.Message="Saved Successfully";
  }
  return View(vm);  
}

2)存储在Session / TempData等临时位置。 TempData意味着一个非常短暂的实例,你应该只在当前和后续请求中使用它!

TempData["UserMsg"] = "Saved Successfully";
return RedirectToAction("ThankYou","Account");

在您的ThankYou操作中,您可以阅读它并根据需要向用户显示。

public ActionResult ThankYou(string msg)
{
   var msg = TempData["UserMsg"] as string; 
   //to do  : do what you want with the message and return the view.
}

Session对象是TempData对象的后备存储,它比常规会话更快地被销毁,即紧接在后续请求之后。