- 在項目下新建一個文件夾來專門放過濾器類,首先創建一個類LoginFilter,這個類繼承ActionFilterAttribute。用來檢查用戶是否登錄和用戶權限。:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace weixinmenu.Filter { /// <summary> /// 這個過濾器類繼承ActionFilterAttribute /// </summary> public class LoginFilterAttribute:ActionFilterAttribute { /// <summary> /// 改寫onactionexecuting(在controller action執行之前調用),去判斷請求中是不是存了session。使用場景:如何驗證登錄等。 /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuting(ActionExecutingContext filterContext) { if (HttpContext.Current.Session["UserName"] == null) { HttpContext.Current.Response.Write("<script>alert('請先登錄');window.parent.location.href='/Users/Login'</script>"); }//這種是通過返回一段js代碼來實現跳轉登錄頁面 //if (filterContext.HttpContext.Session["UserName"] == null) //{ // filterContext.HttpContext.Response.Redirect("/Users/Login"); //}//這種就是直接通過過濾器上下文的的http上下文請求來進行重置鏈接 } /// <summary> /// 在Action方法調用后,result方法調用前執行,使用場景:異常處理。 /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuted(ActionExecutedContext filterContext) { // base.OnActionExecuted(filterContext); } /// <summary> /// 在result執行前發生(在view 呈現前),使用場景:設置客戶端緩存,服務器端壓縮. /// </summary> /// <param name="filterContext"></param> public override void OnResultExecuting(ResultExecutingContext filterContext) { //base.OnResultExecuting(filterContext); } /// <summary> /// 在result執行后發生,使用場景:異常處理,頁面尾部輸出調試信息。 /// </summary> /// <param name="filterContext"></param> public override void OnResultExecuted(ResultExecutedContext filterContext) { // base.OnResultExecuted(filterContext); } } }
2.頁面程序,也就是控制器里的程序,如下
LoginFilter是擴展屬性,自定義屬性名稱是根據上面的LoginFilterAttribute名變化而來
當程序走controller/action時,會先走這個自定義特性LoginFilter再走action的。

[Filter.LoginFilter] public class WxMenuController : Controller { // GET: WxMenu WeixinMenuBusiness weixinMenuBusiness = new WeixinMenuBusiness(); public ActionResult Index() { NHibernateHelper nhlper = new NHibernateHelper(); ISession session = nhlper.GetSession(); IEnumerable<WeiXinMenu> kinds = session.Query<WeiXinMenu>(); WeiXinMenu root = kinds.FirstOrDefault(c => c.ParentId == "-1"); ViewBag.root = kinds; return View(root); } public ActionResult Menu() { System.Web.HttpContext curContext = System.Web.HttpContext.Current; if (curContext.Session["UserName"] != null) { ViewBag.UserName = curContext.Session["UserName"].ToString(); } return View(); } /// <summary> /// 返回查詢到的菜單json /// </summary> /// <param name="page"></param> /// <param name="rows"></param> /// <param name="sort"></param> /// <param name="order"></param> /// <returns></returns> public ActionResult MenuGridView(int? page, int? rows, string sort = "", string order = "asc") { return Content(GetMenuGridTree()); } public string GetMenuGridTree() { NHibernateHelper nhlper = new NHibernateHelper(); ISession session = nhlper.GetSession(); List<TreeModel> result = new List<TreeModel>(); List<TreeModel> children = new List<TreeModel>(); IEnumerable<WeiXinMenu> kinds = session.Query<WeiXinMenu>(); WeiXinMenu root = kinds.FirstOrDefault(c => c.ParentId == "-1"); GetMenuGridTree(kinds, children, "10000"); result.Add(new TreeModel { Id = root.Id.ToString(), MenuId = root.MenuId, Text = root.MenuName, Url = root.MenuUrl, ParentMenuId = root.ParentId.ToString(), IsEnable = root.IsEnable, OrderBy = root.OrderBy.ToString(), Target = root.MenuType, Ico = root.MenuKey, children = children }); return JsonConvert.SerializeObject(result); } private void GetMenuGridTree(IEnumerable<WeiXinMenu> kinds, List<TreeModel> children, string pId) { foreach (WeiXinMenu p in kinds.Where(c => c.ParentId == pId).OrderBy(c => c.OrderBy)) { TreeModel gt = new TreeModel(); gt.Id = p.Id.ToString(); gt.MenuId = p.MenuId; gt.Text = p.MenuName; gt.Url = p.MenuUrl; gt.ParentMenuId = p.ParentId; gt.IsEnable = p.IsEnable; gt.OrderBy = p.OrderBy.ToString(); gt.Target = p.MenuType; gt.Ico = p.MenuKey; List<TreeModel> childrenTmp = new List<TreeModel>(); GetMenuGridTree(kinds, childrenTmp, p.MenuId); /* if (childrenTmp.Count > 0) { gt.state = "closed"; } */ gt.children = childrenTmp; children.Add(gt); } } public JsonResult MenuToWeiXin() { try { MenuManager.CreateMenu(); return Json(new { Success = true, Message = "請求成功" }); } catch (Exception ex) { return Json(new { Success = false,Message = ex.Message }); } } /// <summary> /// 保存更新操作 /// </summary> /// <param name="model"></param> /// <returns></returns> public JsonResult MenuSaveOrUpdate(WeiXinMenu model) { try { NHibernateHelper nhlper = new NHibernateHelper(); ISession session = nhlper.GetSession(); session.SaveOrUpdate(model); session.Flush(); return Json(new { Success = true,Message = "保存成功"}); } catch (Exception ex) { return Json(new { Success=false,Message = ex.Message}); } } /// <summary> /// 菜單刪除函數 /// </summary> /// <param name="ids"></param> /// <returns></returns> public JsonResult MenuDelete(string ids) { try { NHibernateHelper nhlper = new NHibernateHelper(); ISession session = nhlper.GetSession(); string[] idss= ids.Split('\''); string idsss = idss[1]; int id = int.Parse(idsss); WeiXinMenu tmpentites = session.Get<WeiXinMenu>(id); session.Delete(tmpentites); session.Flush(); return Json(new { Success = true,Message = "刪除成功"}); } catch (Exception ex) { return Json(new { Success=false,Message = ex.Message}); } } /// <summary> /// 菜單編輯函數 /// </summary> /// <param name="id"></param> /// <returns></returns> public ActionResult MenuEdit(int id) { NHibernateHelper nhlper = new NHibernateHelper(); ISession session = nhlper.GetSession(); WeiXinMenu model = session.Get<WeiXinMenu>(id); if (model == null) { model = new WeiXinMenu(); model.IsEnable = "1"; model.CreateTime = DateTime.Now; } return View(model); } public ActionResult MenuTree() { string ids = Request["ids"]; List<string> data = new List<string>(); if (ids.IsNotNull()) { data = ids.ToStrList(','); } return Content(GetMenuComboTree(data)); } public static string GetMenuComboTree(List<string> data) { NHibernateHelper nhlper = new NHibernateHelper(); ISession session = nhlper.GetSession(); List<ComboTree> result = new List<ComboTree>(); List<ComboTree> children = new List<ComboTree>(); IEnumerable<WeiXinMenu> kinds = session.Query<WeiXinMenu>(); WeiXinMenu root = kinds.FirstOrDefault(c => c.ParentId == "-1"); GetMenuComboTree(kinds, children, root.MenuId, data); result.Add(new ComboTree { id = root.MenuId.ToString(), text = root.MenuName, @checked = false, children = children }); return JsonConvert.SerializeObject(result); } public static void GetMenuComboTree(IEnumerable<WeiXinMenu> kinds, List<ComboTree> children, string pId, List<string> data) { foreach (WeiXinMenu p in kinds.Where(c => c.ParentId == pId).OrderBy(c => c.OrderBy)) { ComboTree gt = new ComboTree(); gt.id = p.MenuId; gt.text = p.MenuName; List<ComboTree> childrenTmp = new List<ComboTree>(); GetMenuComboTree(kinds, childrenTmp, p.MenuId, data); gt.children = childrenTmp; if (childrenTmp.Count == 0 && data.Contains(p.Id.ToString())) { gt.@checked = true; } else { gt.@checked = false; } children.Add(gt); } } }
3.在登錄時存Session的操作:
在驗證用戶輸入的用戶名和密碼都是正確之后。把用戶名存到Session中去。 Session["UserName"] = UserName;
ps:
在每次重新生成項目在時候,session 會過期,在 web.config 修改一下 session 配置,把session改成存在單線程里面即可解決。
web.config:
<system.web> <sessionState mode="StateServer" timeout="30"></sessionState> </system.web>
推薦一個比較好的講相關內容的博客:http://blog.csdn.net/u010096526/article/details/46700581
一個MVC系列的博客:http://www.cnblogs.com/P_Chou/archive/2010/11/01/details-asp-net-mvc-content.html