从1周的ActionResult存储一个js值在另一个的ActionResult使用(storing

2019-09-02 12:11发布

我有一个控制器,并在一个ActionResult S,有被退回,我可以通过访问一个JavaScript值:

Request.QueryString["frequency"]

但我需要使用相同的变量在其他ActionResult 。 我怎样才能做到这一点?

我知道,我不能设置一个

string frequency = "";

在控制器的顶部,然后只在第1集ActionResult

Answer 1:

HTTP是无状态的,每个请求有它自己的状态和控制器实例。

您可以使用TempData其中使用Session ,但删除值阅读后。



Answer 2:

当你说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的 - 不知道你在做什么这个答案概述了选择的状态持久存储的通用方法。

要问自己的关键问题是:

  • 需要看到这个值-究竟是谁的要求所产生的价值,或者其他用户以及用户,
    • 如果用户特定的,是他们登录,他们有一个会议?
  • 他们需要多长时间才能够看到它(只有一个请求,也许第二天)
  • 在那里他们会希望看到它(只是在目前的浏览器,或在另一个会话)

您的数据持久性选项是多种多样的,每完成一个稍微不同的角色,虽然很多的重叠与他人在他们的潜在用途(如SessionTempData )。 我列出了下面的很多人,所有这些都取决于具体的方案可以解决你的问题。 前两个(查看持久化数据或TempData的)最有可能对您有用,但在没有更多信息,其他人实际上可能是你需要的人。

曾经有至少九个选项在ASP.NET管理永久性用户状态 ,其中很多人在MVC仍然适用。


的ViewData和ViewBag

  • 可用 :当前请求中当前用户,但是你可以用它来“存储状态”中生成的HTML准备传递给未来的请求
  • 只有相关的,如果你的ActionResult实际上是一个视图(而不是重定向,或其他的ActionResult像FileStreamResult)
  • 让你从电流控制器的动作为产生这意味着你可以将其插入,可以将其发送回在未来请求例如客户端侧的对象的当前视图的数据传递:
    • 隐藏的表单字段;
    • 查询字符串参数为下一个请求; 要么
    • JavaScript的变量Ajax请求。

这种情况的一个例子将是您的通过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

  • 它维护您的服务器上无国籍,这样你就不必担心被回收工作进程,下一个请求会到不同的服务器Web场等。
  • 这是潜在的“后退按钮证明”作为“国家”坐在已经呈现在页面

缺点:

  • 即呈现HTML唯一有用的操作
  • 并非所有的数据应该是后退按钮证明,一些数据应该不断发展,因此存储为服务器端的状态(如页面命中数)

TempData的

  • 适用于 :当前用户,在此下一请求
  • 默认情况下(在MVC 4),这是通过实施SessionStateTempDataProvider (见文档 )
  • 它真正的意思,当你的ActionResult是重定向到另一个动作使用,你知道你已经存储的数据的确切范围和寿命的方式。

从表面上看,这是为了做正是你想要的,但也有考虑。

  • 它依赖于会话状态,所以适用于仅当您适当配置会话状态Web场和Web园方案。
  • 会话状态也不会回收你的设置根据工作进程之间依然存在。
  • 你也不必担心在“返回”按钮或数据可能无法使用第二次F5场景会发生什么。

会议

  • 适用于 :当前用户,为他们在当前会话中。 适用范围也取决于你如何配置会话状态(例如是本地的应用领域,或者数据库支持和提供整个网络农场)

这有所有相同的考虑TempData ,但你选择何时删除从价值Session 。 它是真正用于有关当前会话(如一个简单的购物车,用户不希望看到他们是否关闭并重新打开浏览器,或访问该网站在手机上以后)的一般信息。


高速缓存

  • 适用于 :所有用户,但仅限于当前应用程序域(所以要小心工作进程回收,网络农场,Web园等)

您可以通过访问该HttpContext的您的控制器的性能。 例如:

HttpContext.Cache["Frequency"] = freq;

饼干

  • 适用于 :当前用户,而只能从它们用于原始请求的浏览器

Cookies是经常被忽视的状态持久性 - 但它们对于某些类型的数据是非常有用的。 请记住,如果用户希望看到与用户身份相关的数据,那么该cookie不会,如果他们登录另一台计算机上的帮助,使用无痕/私人浏览器会话等。


数据库

  • 适用于 :所有用户使用,还是当前用户,或长或短的时间,只要你喜欢-你选择。

数据库是状态持久的爸爸。 如果要存储数据,使用一个数据库,你的应用程序代码应该被视为不稳定,并能够处理重启,Web场的情况等等,等等。 通过“数据库”我的意思是任何形式的数据持久化媒体,从SQL Server中的Redis,Azure的文件存储,Azure的表存储,亚马逊S3等。


其他选项

还有其他的选择,他们不是一般的常用虽然使用。 例如,你可以实现自己的高速缓存( 例如这里 ),或使用...

静态或单班

  • 适用于 :所有用户,所有的请求到该工作进程的服务器上
  • 数据将只有一个工作进程中仍然存在(所以这对网络农场和Web园的影响),只有等到asp的工作进程重新启动
  • 线程安全性仍然是一个问题,但至少可以在该类中封装了线程安全逻辑
  • 很少有用由于耦合到工作流程的生命周期,并在单台服务器

什么不使用

控制器类字段(实例)

  • 适用于 :当前用户,当前只请求(声明:我相信一个新的控制器是MVC中的所有版本的每一个请求创建的,但如果不是这样,那么你永远不会使用这些存储状态)

理论上你永远不会使用这些(除非这是一个演示给你的同事有10分钟的应用程序):

  • 作为一个类的实例字段坚持只因为如果你想存储状态(数据)你应该用你的行动方法中的变量,以更好地传达意图的请求的类(因此当前请求的持续时间)的持续时间/管理对象/值的范围。
  • 所以,如果你使用的实例字段在你的控制器,你可能对控制器方法你是从你的行动呼吁共享数据。
  • 这意味着你可能正在使用您的控制器来制定业务逻辑。
  • 当前的最佳实践规定,控制器应该是调用业务逻辑(包括任何一代视图模型的)行动的集合,(瘦,不胖,控制器)。
  • 人机工程学:控制器类的实例字段表明你应该调整你的代码

你所需要的时间控制器上的实例字段的所有操作,如国际奥委会接口提供公共服务的时候,但这些都不是内或跨请求存储状态。


控制器类字段(静态)

  • 适用于 :所有用户,所有的请求到该工作进程的服务器上
  • 这不是一个好主意 - 静态字段将提供给所有线程的所有用户,所以你不必担心线程安全。 有提供更好的状态存储开箱即用,如果你想分享的所有用户之间的数据,如Cache


文章来源: storing a js value from 1 ActionResult to use in another ActionResult