将对象存储在会话变量中

时间:2016-03-24 18:56:15

标签: c# asp.net-mvc

我有一个下拉菜单,当您选择一个选项值提交表单时,为了避免重复的数据库调用,我将非敏感对象存储在会话中。

private List<Employee> stafflist
{
    get { return Session["stafflist"] as List<Employee>; }
    set { Session["stafflist"] = new Employee(); }
}
private void RemoveStaff()
{
    Session.Remove("stafflist");
}

然而在我的

[HttpPost]
public ActionResult index (...)
{
    //why can't I get the list of staff like this?
    ViewBag.staff=stafflist.Where(..).toList();

    //is the below still needed? i thought i 
    //have a session variable declare above, 
    //and to avoid 30x repetitive db calls? 
    //also note when i include the below the code runs fine, 
    //however, if i take it out it doesn't. i would like to avoid repetitive db calls
    stafflist=db.Employee.toList(); 
}

2 个答案:

答案 0 :(得分:2)

首先,您不应该阻止查询数据库。正确的缓存是 hard 才能做到正确,数据库完全能够执行查询和缓存数据。

如果您完全确定要绕过数据库并查询客户端(即在控制器中),则需要从每个访问者至少一次从数据库中提取整个人员列表。

您可以在对此控制器的第一次GET调用中执行此操作,假设用户将始终访问该控制器:

[HttpGet]
public ActionResult Index (...)
{
    var cachedStaff = db.Employee.toList(); 
    Session["stafflist"] = cachedStaff;
}

然后在POST中,你真正想要进行数据库查询(再次考虑让数据库做它擅长的事情),你可以从会话中查询列表:

[HttpPost]
public ActionResult Index (...)
{
    var cachedStaff = Session["stafflist"] as List<Employee>();

    // TODO: check cachedStaff for null, for when someone posts after 
    // their session expires or didn't visit the Index page first.

    var selectedStaff = cachedStaff.Where(..).ToList();

    // the rest of your code
}

然后你引入的属性可以用作语法糖来清理代码:

private List<Employee> CachedStaff
{
    get { return Session["stafflist"] as List<Employee>; }
    set { Session["stafflist"] = value; }
}

[HttpGet]
public ActionResult Index (...)
{
    CachedStaff = db.Employee.toList(); 
}

[HttpPost]
public ActionResult Index (...)
{
    // TODO: this will throw an ArgumentNullException when
    //  the staff list is not cached, see above.
    var selectedStaff = CachedStaff.Where(..).ToList();

    // the rest of your code
}

答案 1 :(得分:0)

会话对于当前用户和当前会话是唯一的。这意味着当用户关闭浏览器时,会话信息将丢失。如果删除会话cookie,会话也会丢失。阅读state management

如果您想拥有一个可供所有用户使用的全局员工列表,您需要使用其他内容。 Caching是最常见的情况。