0

感谢大家帮助我的努力,基本上我在下面的控制器中遇到了一个问题,让它简单易行:

   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 和 researched 的值都没有改变

我是否错过了 .NET MVC 中的一些关键知识?

任何相关文章都非常欢迎

谢谢

4

4 回答 4

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()
       }

    }
于 2013-07-17T16:21:55.543 回答
1

我猜您之所以问,是因为它没有给出您期望的结果,而不是因为您希望有人为您尝试。简单的答案(假设您的意思是“在 B 的查看页面上”)是“这是 B”。

ARedirectToAction将向浏览器发送重定向,向服务器发起新请求。不幸的是 aViewBag的生命只针对单个请求,因此当操作 B 运行时将不再填充它。

您将需要找到另一种方式来传递数据;例如,在 cookie 中或Session对象内。

于 2013-07-17T16:09:03.427 回答
0

在 asp.net 中,mvc 控制器在请求期间不会保留其字段/属性:您将C在每个 Web 请求上都有新的实例。这意味着您不能期望asearched字段在操作 B 完成后保持其状态。

您可以在请求期间使用 ViewBag(ViewData) 在控制器和视图之间传递值。
您可以在 2 个请求期间使用 TempData 来存储值,例如,它通常用于 PRG 模式。
您可以使用 Session 在客户端会话处于活动状态时保持您的值。
您可以使用页面上的隐藏输入、查询参数或 HttpHeaders 等不太明显的东西在请求之间传递值。

如果你想在动作 A 和 B 之间传递值,你可以使用 TempData 或 Session is collection is not big (它会被存储在加密的 cookie 中,据我记得大小不能超过 4k)。还有一个可能有用的选项。如果您的情况没问题,您可以将您的收藏存储在客户的本地存储中。

于 2013-07-18T05:51:34.147 回答
0

代替:

return RedirectToActionB()

尝试:

return B();

您还将保存一个冗余的 Http 请求。

于 2013-07-17T16:49:03.180 回答