在我的控制器里面我有字符串变量
private string notificationMessage = "";
我想用它将内容复制到ViewBag.Message
并在视图上显示该内容。
因此,在我的编辑操作中,我填充了它的(notificationMessage)内容,如此
notificationMessage = "data is succ. updated!";
return RedirectToAction();
但重定向到Index动作后,此字符串变量为空;
如何解决这个问题?
答案 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对象的后备存储,它比常规会话更快地被销毁,即紧接在后续请求之后。