我有一个控制器,在其中一个中ActionResult
,有一个返回的 javascript 值,我可以通过以下方式访问:
Request.QueryString["frequency"]
但我需要在另一个ActionResult
. 我怎样才能做到这一点?
我知道我无法设置
string frequency = "";
在控制器的顶部,然后设置在 1st 中ActionResult
。
我有一个控制器,在其中一个中ActionResult
,有一个返回的 javascript 值,我可以通过以下方式访问:
Request.QueryString["frequency"]
但我需要在另一个ActionResult
. 我怎样才能做到这一点?
我知道我无法设置
string frequency = "";
在控制器的顶部,然后设置在 1st 中ActionResult
。
当您说 时ActionResult
,我假设您的意思是控制器中返回Actionresult
s 的 Action 方法?例如:
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
)。我在下面列出了其中的许多,根据具体情况,所有这些都可以解决您的问题。前两个(View-persisted data 或 TempData)最有可能对您有用,但在没有更多信息的情况下,其他信息实际上可能是您需要的。
过去在 ASP.NET 中管理持久用户状态至少有九个选项,其中许多仍然适用于 MVC。
这方面的一个例子是将您的freq
变量传递给 Index 方法的视图(例如通过使用ViewBag.Frequency = freq;
,然后使用它@Html.ActionLink
。例如:
@Html.ActionLink("Click for the Next Action", "Detail", "Home",
new { frequency = ViewBag.Frequency }, null)
然后,您的 Detail 操作变为:
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 将无济于事。
数据库是状态持久性之父。您的应用程序代码应该被视为易变的,并且能够处理重启、网络农场场景等。如果您想存储数据,请使用数据库。“数据库”是指任何形式的数据持久性介质,从 SQL Server 到 Redis、Azure 文件存储、Azure 表存储、Amazon S3 等。
还有其他选项,但它们并不常用。例如,您可以实现自己的缓存(此处为示例),或使用...
从理论上讲,您永远不会使用这些(除非这是一个 10 分钟的应用程序,用于向您的同事演示):
您需要控制器上的实例字段的时候是为所有操作(例如 IoC 接口)提供公共服务时,但这些不是在请求内或请求之间存储状态。
Cache
HTTP 是无状态的,每个请求都有自己的状态和控制器实例。
您可以使用TempData
which useSession
但在阅读后删除该值。