繁体   English   中英

ASP.Net MVC数据库驱动的菜单,带缓存

[英]ASP.Net MVC Database-driven menu with caching

我正在尝试为我的网站创建一个菜单。 它需要满足以下要求

  • 它必须是数据库驱动的,从DB中提取数据以构建菜单结构
  • 需要缓存从数据库中提取的数据 - 我不想为每个页面请求命中数据库

目前,我有一个简单的示例运行,但我不知道如何集成缓存。 我想我可能需要在整个工作方式上进行修改。 这里是:

我有一个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上使用它来从DB构建我的菜单,我打电话给任何一个动作。

现在的问题是 - 如何在这种情况下添加缓存? 我不知道从哪里开始,并且感觉我拥有的解决方案不可缓存。

我认为我真正想要的是使用MVC Futures项目中的Html.RenderAction()帮助扩展。

我们的想法是使用上面的方法在控制器上调用一个动作,它将通过从数据库中提取数据来生成HTML菜单结构。 然后我还使用简单的输出缓存来缓存数据几分钟。

这是迄今为止我发现的最简单的方法,可以达到我想要的效果。

编辑: Phil Haack最近在博客上发表了这篇文章 - Html.RenderAction和Html.Action 一篇很棒的博客文章,涵盖了我所有的确切需求,并解释了所有问题。

为了使缓存正常工作,我需要将我的Html.RenderAction()调用放在ViewUserControl中,并使用OutputCaching指令设置如下:

<@ OutputCache Duration="100" VaryByParam="None" %>

然后我用Html.RenderPartial()调用上面的Html.RenderPartial() ,瞧,一切正常!

您可以修改存储库以识别缓存:请参阅以下两个问题: 缓存存储库http缓存

我是通过使用企业库缓存块完成此操作的。 检查缓存数据,如果没有缓存数据,则从数据库中的数据创建html字符串并将其放入缓存中,以便稍后在搜索缓存数据时,您只需输出纯字符串:D

只是提到这样做的代码是在静态类中。 生病的帖子示例,但我从头开始重写MVC2中的应用程序,所以我没有手工编写代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM