我想爲我的網站創建一個菜單。它需要滿足以下要求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建立我的菜單從數據庫,這是我打電話的任何行動。
現在的問題是 - 如何將緩存添加到這種情況?我不知道從哪裏開始,並且感覺我的解決方案不能緩存。
對於與代碼相關的所有用途,此菜單是靜態的,對不對?爲什麼不創建一個知道ProductMenu類的局部視圖?這不會消除你的緩存問題,但會像我這樣的旁觀者看起來更清潔。如果我在哪裏更換菜單,我知道我會花幾個小時來弄清楚產品如何進入視圖數據。我可能看不到[ProductMenu]應用於控制器類。 – 2009-12-28 12:59:34
我同意部分視圖會更清晰,但我的示例旨在簡化。 – 2009-12-30 13:22:48