我有一个控制器和两个动作。
在我的Products
行动中,我正在填写我的收藏品。然后当我调用Index
操作时,再次调用ProductManager.ReadProducts()
方法。
我不想在第二次动作呼叫时连接到数据库。
public class ProductController : Controller
{
public List<Product> ProductsList = ProductManager.ReadProducts();
public ActionResult Index(long Id)
{
return View(ProductsList.FirstOrDefault(x => x.Id == Id));
}
public ActionResult Products()
{
return PartialView(ProductsList);
}
}
答案 0 :(得分:4)
正如@ stephen-muecke所提到的,你有很少的解决方案
解决方案1: Session 但请注意会话是按用户划分的。如果您的产品是用户特定的,您可以使用它。
public class ProductController : Controller
{
public List<Product> ProductsList {
get {
var products = (Session["ProductsList"] as List<Product>);
if(products == null)
{
products = ProductManager.ReadProducts();
Session["ProductsList"] = products;
}
return products;
}
}
// actions
}
解决方案2: Caching 适用于所有用户,如果您的产品适用于您为所有用户存储在一个位置的所有用户。< / p>
public class ProductController : Controller
{
public List<Product> ProductsList {
get {
var products = (HttpRuntime.Cache["ProductsList"] as List<Product>);
if(products == null)
{
products = ProductManager.ReadProducts();
HttpRuntime.Cache["ProductsList"] = products;
}
return products;
}
}
// actions
}
解决方案3 :您可以使用 OutputCache 来缓存操作的输出。
public class ProductController : Controller
{
public List<Product> ProductsList = ProductManager.ReadProducts();
[OutputCache(Duration=60, VaryByParam="*")]
public ActionResult Index(long Id)
{
return View(ProductsList.FirstOrDefault(x => x.Id == Id));
}
[OutputCache(Duration=60, VaryByParam="none")]
public ActionResult Products()
{
return PartialView(ProductsList);
}
}
答案 1 :(得分:2)
使用其中一个共享容器,例如Session
public class ProductController : Controller
{
public ActionResult Index(long Id)
{
return View(GetProductList().FirstOrDefault(x => x.Id == Id));
}
public ActionResult Products()
{
return PartialView(GetProductList());
}
private IList<Product> GetProductList()
{
var productList = Session["ProductsList"];
if (productList != null)
{
return productList;
}
productList = ProductManager.ReadProducts();
Session["ProductsList"] = productList;
return productList;
}
}