感谢大家帮助我的努力,基本上我在下面的控制器中面临一个问题,只需简单易行:
Controller C{
public list<model> a;
//used in action A, if it's a searched list, then don't initialize;
public bool searched = false;
public ActionResult A(){
if(searched){
ViewBag.a = a;
}else
//initial the list
a = db.model.where();
.....
return view()
}
//return a result list when people search by keywords
public ActionResult B(string str){
a = db.model.where(d=> d.id = str);
search = true;
}
}
但事实证明,在B调用
之后,a和研究的价值都没有改变我是否错过了.NET MVC中的一些关键知识?
非常欢迎任何相关文章
由于
答案 0 :(得分:4)
您应该使用TempData
在重定向后保留您的值。这正是TempData的设计目的。
在您的示例中,它将是:
Controller C{
public ActionResult A(){
TempData["str"] = "this is A";
return RedirectToActionB()
}
public ActionResult B(){
TempData["str"] += "This is B";
return View()
}
}
答案 1 :(得分:1)
我猜你在问,因为它没有给出你期望的结果,而不是因为你想让别人为你试试。简单的答案(假设你的意思是“在B的视图页面上”)是“这是B”。
RedirectToAction
将向浏览器发送重定向,向浏览器发起新请求。不幸的是,ViewBag
的生命仅适用于单个请求,因此当动作B运行时,它将不再被填充。
您需要找到另一种传递数据的方法;例如,在cookie中或Session
对象内。
答案 2 :(得分:0)
而不是:
return RedirectToActionB()
尝试:
return B();
您还将保存冗余的Http请求。
答案 3 :(得分:0)
在asp.net中,mvc控制器在请求期间不保留其字段/属性:您将在每个Web请求上拥有C
的新实例。这意味着您无法期望{C}个和a
字段在操作B完成后保持其状态。
您可以在请求期间使用ViewBag(ViewData)在控制器和视图之间传递值 您可以使用TempData在2个请求期间存储值,例如,它通常用于PRG模式 当客户的会话处于活动状态时,您可以使用Session来保留您的值 您可以使用页面上的隐藏输入,查询参数或不太明显的内容(如HttpHeaders等)在请求之间传递值。
如果你想在动作A和B之间传递值,你可以使用TempData或者Session is collection不大(它将被存储在加密的cookie中,据我记忆,它的大小不能超过4k)。 还有另一种选择可能有用。如果你的情况没问题,你可以将你的收藏品存放在客户的localstorage中。