我无法管理用户在我的应用上提取的数据。
到目前为止,如果我对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
方法时,所有会话数据都将丢失。
如何?我怎么能保持这些数据存活?
答案 0 :(得分:0)
ID是否特定于用户?列表是否如此之大,以至于这甚至有意义? (它很少,如果确实如此,你会想在服务器上实现分页以减少检索时间)
如果是我,我会根据ID将数据序列化为文件,然后当用户回来并且会话已过期时,您不需要重新检索数据。您可以检查文件的时间戳,如果时间戳太旧,则重新加载数据。