我正在尝试为我的网站创建一个菜单。它需要满足以下要求
- 它必须是数据库驱动的,从数据库中提取数据以建立菜单结构
- 从数据库中提取的数据需要缓存 - 我不想为每个页面请求访问数据库
目前,我有一个简单的示例正在运行,但我不知道如何集成缓存。我想我可能不得不重新设计我这样做的整个方式。这里是:
我有一个ProductMenuAttribute,它从数据库中提取数据,并将其存储在 ViewData 中:
public class ProductMenuAttribute: FilterAttribute, IActionFilter
{
#region IActionFilter Members
public void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext != null)
{
var context = filterContext.Result as ViewResult;
if (context != null)
{
ProductsRepository repository = new ProductsRepository(Properties.Settings.Default.SqlConnectionString);
context.ViewData.Add("ProductsList", repository.GetAllProductRanges());
}
}
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
}
#endregion
}
在我的Site.master中,我从ViewData中提取数据并使用它来呈现我的菜单。这是我的无序菜单列表中的一个小片段,它使用 CSS 设置样式。这是代码:
<li>
<%= Html.ActionLink("Products", "Index", "Products")%>
<% IQueryable<ProductRange> productRanges = ViewData["ProductsList"] as IQueryable<ProductRange>; %>
<% if (productRanges != null)
{ %>
<ul>
<% foreach (ProductRange range in productRanges)
{ %>
<li><%= Html.ActionLink(range.Name, "RangeDetails", "Products", new { id = range.ID }, null)%></li>
<% } %>
</ul>
<% } %>
</li>
然后我用[ProductMenu]属性装饰每个控制器,如下所示:
[ProductMenu]
public class HomeController : BaseController
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
return View();
}
}
现在,每当我的控制器上的任何操作被命中时,都会调用ProductMenuAttribute类中的OnActionExecuted方法,这将设置 ViewData,最终将在我的Site.Master上使用它来从数据库构建我的菜单,这时候我调用任何动作。
现在的问题是 - 我如何在这个场景中添加缓存?我不知道从哪里开始,并且感觉我的解决方案不可缓存。