我正在尝试为我的网站创建一个菜单。它需要满足以下要求
目前,我有一个简单的示例运行,但我不知道如何集成缓存。我想我可能需要在整个工作方式上进行修改。这是:
我有一个 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 ,以便从数据库构建我的菜单,这次我调用了任何操作。
现在的问题是 - 如何在此方案中添加缓存?我不知道从哪里开始,并且感觉我的解决方案不可缓存。
答案 0 :(得分:6)
我认为我真正想要的是使用MVC Futures项目中的 Html.RenderAction()帮助扩展程序。
这个想法是使用上面的方法在控制器上调用一个动作,它将通过从数据库中提取数据来生成HTML菜单结构。然后我还使用简单的输出缓存来缓存数据几分钟..
这是迄今为止我发现的最简单的方法,可以达到我的目的。
编辑: Phil Haack最近在博客中发表了这篇文章 - Html.RenderAction and Html.Action。一篇很棒的博客文章,涵盖了我所有的确切需求,并解释了所有问题。
要使缓存正常工作,我需要将Html.RenderAction()
调用放在 ViewUserControl 中,并将OutputCaching指令设置如下:
<@ OutputCache Duration="100" VaryByParam="None" %>
然后我用Html.RenderPartial()
调用上面的内容,瞧,一切正常!
答案 1 :(得分:1)
您可以修改存储库以识别缓存:请参阅以下两个问题: cached repository和http cache。
答案 2 :(得分:0)
我是通过使用Enterprise Library Caching块完成的。检查缓存数据,如果没有缓存数据,则从数据库中的数据创建html字符串并将其放入缓存中,以便稍后在搜索缓存数据时,您只需输出纯字符串:D
提到这样做的代码是在静态类中。生病的帖子示例,但我从头开始重写MVC2中的应用程序,所以我没有手工编写代码。