2009-12-28 46 views
5

我想爲我的網站創建一個菜單。它需要滿足以下要求ASP.Net MVC數據庫驅動的菜單與緩存

  • 它必須是數據庫驅動的,從數據庫中提取數據建立起來的菜單結構
  • 需要緩存從數據庫被拉扯的數據 - 我不想打每個頁面請求的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] attribuate每個控制器如下:

[ProductMenu] 
public class HomeController : BaseController 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
} 

現在,每當我的任何控制器上的動作都命中,OnActionExecuted方法在ProductMenuAttribute類將被調用,這將設置ViewData,它最終將用於我的Site.Master建立我的菜單從數據庫,這是我打電話的任何行動。

現在的問題是 - 如何將緩存添加到這種情況?我不知道從哪裏開始,並且感覺我的解決方案不能緩存。

+0

對於與代碼相關的所有用途,此菜單是靜態的,對不對?爲什麼不創建一個知道ProductMenu類的局部視圖?這不會消除你的緩存問題,但會像我這樣的旁觀者看起來更清潔。如果我在哪裏更換菜單,我知道我會花幾個小時來弄清楚產品如何進入視圖數據。我可能看不到[ProductMenu]應用於控制器類。 – 2009-12-28 12:59:34

+0

我同意部分視圖會更清晰,但我的示例旨在簡化。 – 2009-12-30 13:22:48

回答

6

我認爲我真正想要的是使用MVC Futures項目的幫助器擴展Html.RenderAction()

我們的想法是使用上述方法在控制器上調用一個操作,該控制器將通過從數據庫中提取數據來生成HTML菜單結構。然後,我也使用簡單的輸出緩存來緩存數據幾分鐘..

這是我迄今爲止發現的最簡單的方法來實現我想要的。

編輯: Phil Haack最近在博客上寫道 - Html.RenderAction and Html.Action。一篇很好的博客文章,涵蓋了我所有的確切需求,並解釋了所有問題。

要獲得高速緩存才能正常工作,我需要把我的Html.RenderAction()呼叫ViewUserControl內側設置OutputCaching指令如下:

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

我隨後致電以上Html.RenderPartial(),瞧,它一切正常!

0

我已經通過使用企業庫緩存塊來完成此操作。你檢查緩存的數據,如果沒有緩存的數據,你從數據庫中的數據創建html字符串,並將其放入緩存,以便以後搜索緩存數據時,您可以輸出純字符串:D

只需提及這樣做的代碼是靜態類。病後的例子,但我從頭開始重寫MVC2中的應用程序,所以我沒有手動代碼。