最好的方式來處理你的情況是與孩子的行動。你只需創建一個動作在你的項目中的一些控制器中,因爲這涉及用戶級訪問,所以我將使用AccountController
。
[AllowAnonymous]
[ChildActionOnly]
public ActionResult UserMenu()
{
if (User.Identity.IsAuthenticated())
{
// logic to select your menu from database
return View(menu);
}
// optionally you can return a different menu for anonymous users here
return Content("");
}
然後,您在Views\Account
目錄中創建UserMenu.cshtml
視圖。在這個視圖中,您只需使用您傳入的模型實例(上面的menu
)來呈現menu
對象適用的部分站點導航。
最後,在你的佈局,無論你想這個菜單出現,請致電:
@Html.Action("UserMenu", "Account");
如果你想只有這樣跑一次(真不如把爲「偶爾」),那麼你可以利用緩存。只需以下附加屬性添加到您的孩子的行動:
[OutputCache(Duration = 3600, VaryByCustom = "User")]
有一個在方式改變特定用戶的高速緩存中沒有建成,所以你必須創建一個自定義有所不同。雖然這是相對容易的。只需添加類似於下面的東西到Global.asax中:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if(arg.ToLower() == "user")
{
if (context.User.Identity.IsAuthenticated())
{
return context.User.Identity.Name;
}
return null;
}
return base.GetVaryByCustomString(context, arg);
}
然後,MVC將緩存UserMenu
行動爲每個唯一用戶的輸出爲1小時(3600秒),由同一個用戶意味着任何其他請求都將在緩存過期之前,不要調用該操作或向數據庫發送任何查詢。
創建全局變量的最佳方式不是創建一個。 –
應避免使用全局變量。您可以使用具有您調用的方法的服務類來獲取此信息。該服務方法會觸發數據庫或執行所需的設置,並將結果緩存到私有靜態集合中。你應該真的避免一個真正全球化的公共靜態屬性。它會在以後咬你。 –
您應該檢查用戶的角色。如果用戶遇到特定角色,然後顯示菜單?爲什麼你不想要這種方法? –