sha*_*inz 1 javascript c# asp.net-mvc jquery asp.net-mvc-3
我有一个控制器,在其中一个ActionResult
s中,返回了一个javascript值,我可以通过以下方式访问:
Request.QueryString["frequency"]
Run Code Online (Sandbox Code Playgroud)
但我需要在另一个变量中使用相同的变量ActionResult
.我怎样才能做到这一点?
我知道我不能设置一个
string frequency = "";
Run Code Online (Sandbox Code Playgroud)
在控制器的顶部,然后只在第一个设置ActionResult
.
And*_*own 10
当你说ActionResult
,我假设你的意思是你的Action方法在控制器中返回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();
}
}
Run Code Online (Sandbox Code Playgroud)
正如您的问题引用ActionResult,这可能是任何类型的ActionResult - 如果不知道您正在做什么,这个答案概述了选择状态持久性存储的一般方法.
要问自己的关键问题是:
您对数据持久性的选择有很多种,每种都有不同的作用,尽管许多在其潜在用途中与其他人重叠(例如Session
和TempData
).我在下面列出了很多,根据确切的情况,所有这些都可以解决您的问题.前两个(查看持久数据或TempData)最有可能对您有用,但在没有更多信息的情况下,其他可能实际上是您需要的信息.
在ASP.NET中,过去至少有九个用于管理持久用户状态的选项,其中许多仍然适用于MVC.
这方面的一个例子是将您的freq
变量传递给Index方法的View(例如,通过使用ViewBag.Frequency = freq;
,然后使用它@Html.ActionLink
.例如:
@Html.ActionLink("Click for the Next Action", "Detail", "Home",
new { frequency = ViewBag.Frequency }, null)
Run Code Online (Sandbox Code Playgroud)
您的详细信息操作将变为:
public ActionResult Detail(int frequency) { ...
Run Code Online (Sandbox Code Playgroud)
类似的方法允许您使用隐藏表单字段中的值,或者通过使用var freq = @Html.Raw(Viewbag.Frequency);
例如设置javascript变量的javascript来使用未来的AJAX请求.
注意:有一个思想学派(我认为这是一个很好的学校)你不应该使用它们,而是你应该HomeIndexViewModel
为每个视图创建一个强类型类(如上所述),以允许你更好地测试您的Controller操作和视图.
ViewData
/的优点ViewBag
:
缺点:
SessionStateTempDataProvider
(参见文档)表面上看,它的设计完全符合您的要求,但需要考虑.
这与所有相同的注意事项TempData
,但您选择何时从中删除值Session
.它实际上是用于与当前会话相关的一般信息(例如,用户在关闭并重新打开浏览器时不希望看到的简单购物车,或稍后在他们的移动电话上访问该站点).
您可以通过Controller 的HttpContext属性访问它.例如:
HttpContext.Cache["Frequency"] = freq;
Run Code Online (Sandbox Code Playgroud)
Cookie经常被忽略为状态持久性 - 但它们对某些类型的数据非常有用.请记住,如果用户希望看到与用户身份相关联的数据,那么如果他们在另一台计算机上登录,使用隐身/私人浏览器会话等,cookie将无济于事.
数据库是状态持久性的父亲.您的应用程序代码应被视为易失性,并能够处理重新启动,Web场方案等.如果要存储数据,请使用数据库."数据库"是指任何形式的数据持久性介质,从SQL Server到Redis,Azure文件存储,Azure表存储,Amazon S3等.
还有其他选择,但它们通常不常用.例如,您可以实现自己的缓存(此处示例),或使用...
从理论上讲,你永远不会使用这些(除非这是一个10分钟的演示应用程序给你的同事):
您需要控制器上的实例字段的时间是为所有操作(例如IoC接口)提供公共服务,但这些操作不会在请求内或跨请求存储状态.
Cache
归档时间: |
|
查看次数: |
1153 次 |
最近记录: |