保持Session中存储的数据存活

时间:2014-05-05 21:29:14

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

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

到目前为止,如果我对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方法时,所有会话数据都将丢失。

如何?我怎么能保持这些数据存活?

1 个答案:

答案 0 :(得分:0)

ID是否特定于用户?列表是否如此之大,以至于这甚至有意义? (它很少,如果确实如此,你会想在服务器上实现分页以减少检索时间)

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