我有一个控制器,并在一个ActionResult
S,有被退回,我可以通过访问一个JavaScript值:
Request.QueryString["frequency"]
但我需要使用相同的变量在其他ActionResult
。 我怎样才能做到这一点?
我知道,我不能设置一个
string frequency = "";
在控制器的顶部,然后只在第1集ActionResult
。
我有一个控制器,并在一个ActionResult
S,有被退回,我可以通过访问一个JavaScript值:
Request.QueryString["frequency"]
但我需要使用相同的变量在其他ActionResult
。 我怎样才能做到这一点?
我知道,我不能设置一个
string frequency = "";
在控制器的顶部,然后只在第1集ActionResult
。
HTTP是无状态的,每个请求有它自己的状态和控制器实例。
您可以使用TempData
其中使用Session
,但删除值阅读后。
当你说ActionResult
,我假定你的意思是返回控制器内动作方法Actionresult
S' 例如:
public class HomeController : Controller {
// GET: /Home/
public ActionResult Index() {
var freq = Request.QueryString["frequency"];
// ** Want to persist freq here **
HomeIndexViewModel model = FooLogic.BarIndex();
return View();
}
// GET: /Home/Detail
public ActionResult Detail() {
var freq = **Want to access freq here**;
HomeDetailViewModel model = FooLogic.BarDetail(freq);
return View();
}
}
至于你的问题指的ActionResult,这可能是任何类型的ActionResult的 - 不知道你在做什么这个答案概述了选择的状态持久存储的通用方法。
要问自己的关键问题是:
您的数据持久性选项是多种多样的,每完成一个稍微不同的角色,虽然很多的重叠与他人在他们的潜在用途(如Session
和TempData
)。 我列出了下面的很多人,所有这些都取决于具体的方案可以解决你的问题。 前两个(查看持久化数据或TempData的)最有可能对您有用,但在没有更多信息,其他人实际上可能是你需要的人。
曾经有至少九个选项在ASP.NET管理永久性用户状态 ,其中很多人在MVC仍然适用。
这种情况的一个例子将是您的通过freq
,通过使用可变进信息查看索引方法(例如ViewBag.Frequency = freq;
,然后用使用它@Html.ActionLink
例如:。
@Html.ActionLink("Click for the Next Action", "Detail", "Home",
new { frequency = ViewBag.Frequency }, null)
您的详细操作就变成了:
public ActionResult Detail(int frequency) { ...
类似的方法可以让你在使用的值隐藏表单域通过设置一个JavaScript变量,或在javascript为未来的AJAX请求var freq = @Html.Raw(Viewbag.Frequency);
, 例如。
注意:是,你不应该使用这些,而不是你应该创建一个强类型的类(如上面的想法(我认为这是一个好)的学校HomeIndexViewModel
)为模型的每个视图允许你更好地测试你的控制器动作和视图。
优势ViewData
/ ViewBag
:
缺点:
SessionStateTempDataProvider
(见文档 ) 从表面上看,这是为了做正是你想要的,但也有考虑。
这有所有相同的考虑TempData
,但你选择何时删除从价值Session
。 它是真正用于有关当前会话(如一个简单的购物车,用户不希望看到他们是否关闭并重新打开浏览器,或访问该网站在手机上以后)的一般信息。
您可以通过访问该HttpContext的您的控制器的性能。 例如:
HttpContext.Cache["Frequency"] = freq;
Cookies是经常被忽视的状态持久性 - 但它们对于某些类型的数据是非常有用的。 请记住,如果用户希望看到与用户身份相关的数据,那么该cookie不会,如果他们登录另一台计算机上的帮助,使用无痕/私人浏览器会话等。
数据库是状态持久的爸爸。 如果要存储数据,使用一个数据库,你的应用程序代码应该被视为不稳定,并能够处理重启,Web场的情况等等,等等。 通过“数据库”我的意思是任何形式的数据持久化媒体,从SQL Server中的Redis,Azure的文件存储,Azure的表存储,亚马逊S3等。
还有其他的选择,他们不是一般的常用虽然使用。 例如,你可以实现自己的高速缓存( 例如这里 ),或使用...
理论上你永远不会使用这些(除非这是一个演示给你的同事有10分钟的应用程序):
你所需要的时间控制器上的实例字段的所有操作,如国际奥委会接口提供公共服务的时候,但这些都不是内或跨请求存储状态。
Cache