【问题标题】:Keep data stored in Session alive保持存储在 Session 中的数据处于活动状态
【发布时间】:2014-06-22 07:56:36
【问题描述】:

我无法管理用户在我的应用上获取的数据。

到目前为止,如果我对 ASP.NET MVC 的理解是我认为的那样,我无法将获取的数据放在静态字段中。例如,这样做是个坏主意:

private static List<MyObjects> listObjects = new List<MyObjects> { get; set;}

public List<MyObjects> GetMyObjects (int _objectID)
{
    using(MyDatabase database = new MyDatabase())
    {
        listObjects = (from o in database.MyObjects
                                where o.MatchingID == _objectID
                                select o).ToList();

        return listObjects;
    }
}

因为这将使网站上的所有用户都可以使用数据列表。所以我读了一些东西,我认为我需要把东西放到 MVC Session 字典中,这样每个用户都可以浏览他们自己的列表。

所以我有这些方法:

public List<MyObjects> GetMyObjects (int _objectID)
{
    using(MyDatabase database = new MyDatabase())
    {
        List<MyObjects> listObjects = (from o in database.MyObjects
                                where o.MatchingID == _objectID
                                select o).ToList();

        return listObjects;
    }
}

[HttpGet]
public ActionResult SeeItemsByID(int? _objectID)
{
    // Pre-validations to make sure that the ID is valid, then:
    List<MyObjects> listObjects = GetMyObjects((int)_objectID);

    Session["myObjects"] = listObjects;

    return RedirectToAction("SeeItems");
}

[HttpGet]
public ActionResult SeeItems()
{
    List<MyObjects> listObjects = Session["myObjects"] as List<MyObjects>;

    if(listObjects == null)
    {
        return RedirectToAction("Home");
    }

    return View(listObjects);
}


[HttpGet]
public ActionResult SeeItemsCompact()
{
    List<MyObjects> listObjects = Session["myObjects"] as List<MyObjects>;

    if(listObjects == null)
    {
        return RedirectToAction("Home");
    }

    return View(listObjects);
}

让我们继续这个过程:

首先,用户单击调用SeeItemsByID 操作的链接,然后将其重定向到SeeItems 操作。在此视图中,用户可以出于任何原因单击链接以查看“压缩”结果。但是,在我的应用程序中,当SeeItemsCompact 方法被立即调用时,所有 Session 数据都会丢失。

怎么样?我怎样才能让这些数据保持活力?

【问题讨论】:

  • 在ASP.NET+MVC中建议使用TempData而不是Session
  • TempData 内部使用 Session 对象,读取值后会被销毁

标签: c# asp.net-mvc session session-variables session-timeout


【解决方案1】:

ID 是特定于用户的吗?列表是否如此之大以至于这甚至有意义? (它很少这样做,如果这样做,您将希望在服务器上实现分页以减少检索时间)

如果是我,我会根据 ID 将数据序列化到一个文件中,然后当用户回来并且会话已过期时,您无需重新检索数据。您可以检查文件上的时间戳,如果时间戳太旧则重新加载数据。

【讨论】:

  • 戴夫,分页已经实现,这不是问题。但我很好奇你建议的序列化,我很想看到一个例子,这对我有很大帮助。
  • stackoverflow.com/questions/16921652/… 当然,在您的情况下,您需要使用 Server.MapPath() 将文件放在应用程序目录下的某个位置
猜你喜欢
  • 2017-01-14
  • 1970-01-01
  • 2014-06-18
  • 2012-01-03
  • 2014-11-16
  • 2012-05-24
  • 2021-09-13
  • 2018-11-26
  • 2013-08-27
相关资源
最近更新 更多