代码之家  ›  专栏  ›  技术社区  ›  Saajid Ismail

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

  •  5
  • Saajid Ismail  · 技术社区  · 15 年前

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

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

    目前,我正在运行一个简单的示例,但我不知道如何集成缓存。我想我可能要用我的整个方法来做。这里是:

    我有一个 产品菜单属性 ,它从数据库中提取数据,并将其存储在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
    }
    

    在我的 主站 我把数据从 可视数据 用它来呈现我的菜单。这是我的未排序菜单列表中的一个小片段,它使用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]
    public class HomeController : BaseController
    {
        public ActionResult Index()
        {
            return View();
        }
    
        public ActionResult About()
        {
            return View();
        }
    }
    

    现在每当我的控制器上的任何操作被击中时, OnAction已执行 方法在 产品菜单属性 将调用类,该类将设置ViewData,它最终将用于 工地主人 从数据库建立我的菜单,这一次我调用任何操作。

    现在的问题是-如何向该场景添加缓存??我不知道从哪里开始,我觉得我的解决方案是不可缓存的。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Saajid Ismail    15 年前

    我想我真正想要的是使用 HTML.renderAction()) MVC Futures项目的帮助程序扩展。

    其思想是使用上述方法调用控制器上的操作,该操作将通过从数据库中提取数据来生成HTML菜单结构。然后我还使用简单的输出缓存将数据缓存几分钟。

    这是迄今为止我找到的最简单的方法来实现我想要的。

    编辑: 菲尔·哈克最近在博客中提到了这一点。- Html.RenderAction and Html.Action . 一篇很好的博文,涵盖了我所有的确切需求,并解释了所有的问题。

    为了使缓存正常工作,我需要 Html.RenderAction() 内部调用 视图控件 outputcaching指令设置如下:

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

    然后我打电话给上面的 Html.RenderPartial() 瞧,一切都好!

        2
  •  1
  •   Community CDub    8 年前

    您可以将存储库修改为具有缓存意识:请参见以下两个问题: cached repository http cache .

        3
  •  0
  •   zveljkovic    14 年前

    我通过使用企业库缓存块来完成这项工作。检查缓存数据,如果没有缓存数据,则从数据库中的数据创建HTML字符串并将其放入缓存中,以便稍后搜索缓存数据时只输出纯字符串:d

    只需提到用于执行该操作的代码在静态类中。我将发布示例,但我将从头开始在MVC2中重写该应用程序,这样我就不需要手工编写代码了。