我有一个Controller,在其中一个ActionResult
中,有一个我可以通过以下方式访问的javascript值:
Request.QueryString["frequency"]
但我需要在另一个ActionResult
中使用相同的变量。我怎样才能做到这一点?
我知道我无法设置
string frequency = "";
位于Controller的顶部,然后只需设置在第一个ActionResult
。
答案 0 :(得分:10)
当你说ActionResult
时,我假设你的意思是控制器中返回Actionresult
s的Action方法? e.g:
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)最有可能对您有用,但在没有更多信息的情况下,其他可能实际上是您需要的信息。
过去至少Nine Options for Managing Persistent User State in ASP.NET,其中许多仍然适用于MVC。
这方面的一个示例是将您的freq
变量传递给Index方法(例如,使用ViewBag.Frequency = freq;
,然后将其与@Html.ActionLink
一起使用。例如:< / p>
@Html.ActionLink("Click for the Next Action", "Detail", "Home",
new { frequency = ViewBag.Frequency }, null)
您的详细信息操作将变为:
public ActionResult Detail(int frequency) { ...
例如,通过使用var freq = @Html.Raw(Viewbag.Frequency);
设置javascript变量,类似的方法可以让您使用hidden form fields中的值或javascript中的值来表示未来的AJAX请求。
注意:有一种思想流派(我认为这是一个很好的学校)你不应该使用这些,而应该创建一个强类型的类(例如高于HomeIndexViewModel
的每个视图的模型允许您更好地测试您的控制器操作和视图。
ViewData
/ ViewBag
的优点:
缺点:
SessionStateTempDataProvider
实现的(请参阅documentation)表面上看,它的设计完全符合您的要求,但也有考虑因素。
这与TempData
具有相同的注意事项,但您选择何时从Session
中删除值。它实际上是用于与当前会话相关的一般信息(例如,如果用户关闭并重新打开浏览器,或者稍后在他们的移动电话上访问该网站,则用户不希望看到的简单购物车)。 / p>
您可以通过Controller的HttpContext属性访问它。 E.g:
HttpContext.Cache["Frequency"] = freq;
Cookie经常被忽略为状态持久性 - 但它们对某些类型的数据非常有用。请记住,如果用户希望看到与用户身份相关联的数据,那么如果他们在另一台计算机上登录,使用隐身/私人浏览器会话等,则cookie无法提供帮助。
数据库是状态持久性的父亲。您的应用程序代码应被视为易失性,并能够处理重新启动,Web场方案等。如果要存储数据,请使用数据库。通过&#34;数据库&#34;我的意思是任何形式的数据持久性介质,从SQL Server到Redis,Azure文件存储,Azure表存储,Amazon S3等。
还有其他选择,但它们并不常见。例如,您可以实现自己的缓存(example here),或使用...
从理论上讲,你永远不会使用这些(除非这是一个10分钟的同事演示应用程序):
控制器上需要实例字段的时间是为所有操作提供公共服务,例如IoC接口,但这些服务不会在请求中或跨请求存储状态。
Cache
答案 1 :(得分:3)
HTTP是无状态的,每个请求都有自己的状态和Controller实例。
您可以使用使用TempData
的{{1}},但在阅读后删除该值。