我有一个下拉菜单,当您选择一个选项值提交表单时,为了避免重复的数据库调用,我将非敏感对象存储在会话中。
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();
}
答案 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是最常见的情况。