ASP MVC4:在控制器中操作变量值时的问题

时间:2013-07-17 16:04:16

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

感谢大家帮助我的努力,基本上我在下面的控制器中面临一个问题,只需简单易行:

   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中的一些关键知识?

非常欢迎任何相关文章

由于

4 个答案:

答案 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中。