【问题标题】:How to persist the data in memory in MVC controller?如何将数据保存在 MVC 控制器的内存中?
【发布时间】:2013-01-02 19:29:41
【问题描述】:

请看下面的动作。当用户第一次导航时,创建一个对象,然后当他在页面中导航时,再次访问 Action,但通过 Ajax 请求和数据消散器(工作表 = null)。

    private static List<Worksheet> worksheets;
    public ActionResult DoTest()
    {
        if (Request.IsAjaxRequest())
        {
            return PartialView("_Problems", worksheets[1]);
        }

        // first time
        worksheets = new List<Worksheet>()
        {
            new Worksheet("Hoja 1", ...),
            new Worksheet("Hoja 2", ...)
        };
        return View(worksheets[0]);
    }

我的第一个解决方案是将变量工作表设置为静态,但我认为这不是一个好习惯。我做得好还是有另一个 tweeks?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


    【解决方案1】:

    远离静态变量,尤其是在数据依赖于用户的情况下。您可以利用 ASP.NET Session 对象。

    在您的情况下,这可以通过将工作表字段更改为将其值存储在 Session 对象中的属性来轻松完成。这样,它将在后续调用中可用。示例:

      private List<Worksheet> worksheets
      {
        get{ return Session["worksheets"] as List<Worksheet>;}
        set{ Session["worksheets"] = value; }
      }
    
      public ActionResult DoTest()
      {
          if (Request.IsAjaxRequest())
          {
            return PartialView("_Problems", worksheets[1]);
          }
    
          // first time
          worksheets = new List<Worksheet>()
          {
              new Worksheet("Hoja 1", ...),
              new Worksheet("Hoja 2", ...)
          };
          return View(worksheets[0]);
      }
    

    【讨论】:

    • 谢谢 Ulises,它确实成功了!只是一个答案,它喜欢 Session 字典的工作方式很有趣,想象一下浏览器已关闭。如果浏览器关闭,如何将会话保持到 60 分钟(含 60 分钟)。
    • @DarfZon Session 对象的默认值为 20 分钟(您可以在配置文件中更改)。除非您之前清除它,否则即使用户关闭浏览器,它也会在服务器端保持活动状态;但是,这可能会导致服务器为用户分配不同的会话对象(取决于您的身份验证机制)
    【解决方案2】:

    控制器的实例不会在请求之间持续存在(这就是为什么使工作表成为静态工作,但保持非静态不会 - 由于您的 if 语句,该对象仅在非 AJAX 请求上填充)。

    一个选项是无论请求如何进入都填充对象,然后使用 if 语句来决定返回哪个项目。正如 Ulises 所提到的,另一个(可能更好)的解决方案是使用会话。

    【讨论】:

      【解决方案3】:

      在 ASP.NET Core Session 不支持通用数据类型你需要添加这个扩展

      using Microsoft.AspNetCore.Http;
      using Newtonsoft.Json;
      
      public static class SessionExtensions
      {
          public static void Set<T>(this ISession session, string key, T value)
          {
              session.SetString(key, JsonConvert.SerializeObject(value));
          }
      
          public static T Get<T>(this ISession session,string key)
          {
              var value = session.GetString(key);
              return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
          }
      }
      

      并使用它:

      public IActionResult SetDate()
      {
          // Requires you add the Set extension method mentioned in the article.
          HttpContext.Session.Set<DateTime>(SessionKeyDate, DateTime.Now);
          return RedirectToAction("GetDate");
      }
      
      public IActionResult GetDate()
      {
          // Requires you add the Get extension method mentioned in the article.
          var date = HttpContext.Session.Get<DateTime>(SessionKeyDate);
          var sessionTime = date.TimeOfDay.ToString();
          var currentTime = DateTime.Now.TimeOfDay.ToString();
      
          return Content($"Current time: {currentTime} - "
                       + $"session time: {sessionTime}");
      }
      

      【讨论】:

        猜你喜欢
        • 2017-04-24
        • 2023-03-16
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 2015-10-17
        • 2018-06-16
        • 2011-10-31
        相关资源
        最近更新 更多