0

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

private string notificationMessage = "";

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

所以在我的编辑操作中,我填充它的(notificationMessage)内容,如下所示

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

但是在重定向到索引操作之后,这个字符串变量是空的;

如何解决这个问题?

4

2 回答 2

4

使用TempData而不是ViewBag. 它在请求之间持续存在。

于 2013-03-18T12:28:18.897 回答
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 对象的后备存储,它比常规会话更快地被销毁,即在后续请求之后立即销毁。

于 2013-03-18T12:38:21.530 回答