前面提到過用Asp.net MVC3.0正在做一個問答系統性質的論壇。前期把菜單全部顯示以方便測試模塊功能。現在正在完善,加上角色模塊,然后不同的角色登陸系統會看到不同的菜單欄,還有就是游客(未登錄用戶)看到的菜單欄。網上也搜到了幾篇關於動態顯示菜單的文章,不是很喜歡,動態顯示菜單,我感覺不如靜態的爽快,而且動態的從數據庫中取出菜單項,本身就是耗時間的事情,加上寫在數據庫中還需要維護,而且菜單也沒那么多,都是一定的,也不需要動態擴展,決定用靜態的。
由於后台都是自定義的AuthorizeAttribute和Role,所以不能用Asp.net MVC3.0內置的User.IsInRole()和Roles.IsUserInRole()來判斷登陸用戶的角色信息。所以只能自己添加了。
所做項目的菜單是在Layout中顯示的,所以先在Layout中稍作修改,這是一個小例子,將
<div id="menucontainer"> <ul id="menu"> <li>@Html.ActionLink("Home", "Index", "Home")</li> <li>@Html.ActionLink("About", "About", "Home")</li> </ul> </div>
改為
<div id="menucontainer"> <ul id="menu"> @{Html.RenderAction("你的菜單Action名字", "你的菜單Controller名字");} </ul> </div>
其中@Html.RenderAction是通過Controller中的Action來調用用戶控件,將Action對應的View當做Partial部分顯示在調用處。
然后建立對應的菜單的Controller和Action。(你也可以先建立菜單Controller和Action)
分別命名為TestMenuController和Menu。
using System.Collections.Generic; using System.Web.Mvc; namespace test.Controllers { public class TestMenuController : Controller { // // GET: /TestMenu/ public ActionResult Menu() { List<Role> _testroles = new List<Role>(); /*根據User.Instance.Name或者你登陸的時候將你的用戶信息放入Session中,取出,然后根據用戶, 獲取你自己定義的role信息*/ //將角色名稱放入List<string>中 List<string> roles = new List<string>(); return PartialView(roles); } } }
建立對應的Menu.cshtml,選中PartialView。
在Menu.cshtml中加入如下代碼
@model IEnumerable<string> @{ this.Layout = null; } @if(Model.Count()>0&&Model.Contains("角色名稱")){ 你想要顯示的菜單; } ....................此處省略,大體代碼如此,自己寫。
差不多就這樣子了。如果要求菜單動態擴展的話,那也很容易改。同樣的道理。