7.mvc直接的关系 js (_Layout.cshtml模板页使用)和加载树2
=============关于加载区域视图原理==========================

1.MVC架构根据 请求url去静态路由表中 查找 匹配的路由对象
1.1因为路由注册的先后的关系,所以会先去区域路由找查找匹配,如果没有匹配到,才会去 网站路由中找。
1.2找到路由后,根据路由规则+路由指定的命名空间,获取类名 和action方法名
反射创建类的对象,调用Action方法。
1.3 Action方法后会加载视图(默认加载与Action方法同名的视图)
**重要:加载视图,需要视图的 路径(视图一般存两种地方:网站根目录下的Views文件夹,Areas文件夹下匹配区域名的文件夹下的Views)
1.3.1先查看匹配的路由对象的DataTokens属性中是否包含area名!
如果包含,则去Areas文件夹下查找视图
如果不包含,则取网站根目录下的View中查找视图
====================登陆视图加上验证===================
1.MVC验证,加强类型试图
1.1不输入内容要显示错误消息: 
1.1.1在登陆模型里直接加mvc特性
1.1.2文本框/密码框:
@model MODEL.ViewModel.uLoginName //登陆强类型视图 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Login</title> @*<script type="text/javascript" src="~/mvcAjax"></script>*@ <style type="text/css"> #divMsg { display: none; /*visibility:hidden;*/ } </style> <script type="text/javascript"> </script> @Scripts.Render("/mvcAjax") <script type="text/javascript" src="~/Scripts/jquery.msgProcess.js"></script> <script type="text/javascript"> function Success(jsonData) { $.procAjaxData(jsonData, function () { window.location = jsonData.BackUrl; }); } </script> </head> <body> @using (Ajax.BeginForm(new AjaxOptions() { HttpMethod = "post", OnSuccess = "Success", LoadingElementId = "divMsg" })) { <table> <tr> <td>用户名:</td> <td>@Html.TextBoxFor(u => u.LoginNames, new { Value = "admin" })</td> <td>@Html.ValidationMessageFor(u=>u.LoginNames)</td> </tr> <tr> <td>密码:</td> <td>@Html.TextBoxFor(u => u.uPwd3, new { Value = "123123" })</td> <td>@Html.ValidationMessageFor(u => u.uPwd3)</td> </tr> <tr> <td>@Html.CheckBoxFor(u => u.isAllway)</td> <td colspan="2"><input type="submit" value="登陆" /></td> </tr> </table> <div id="divMsg">加载中~~~</div>
控制器AdminController下,Login登陆方法
using MVCOA.Helper; using System; using System.Collections.Generic; using System.Web; using System.Web.Mvc; namespace MVCOA.Login.Admin { /// <summary> /// 管理员登陆等相关业务 /// </summary> public class AdminController : Controller { #region 1.0 管理员登陆页面 +ActionResult Login() /// <summary> /// 1.0 管理员登陆页面 /// </summary> /// <returns></returns> [HttpGet] [Common.Attributes.Skip] public ActionResult Login() { return View(); } #endregion #region 1.0 管理员登陆页面 +ActionResult Login() /// <summary> /// 1.0 管理员登陆页面 /// </summary> /// <returns></returns> [HttpPost] [Common.Attributes.Skip] public ActionResult Login(MODEL.ViewModel.uLoginName UserLogin) //登陆扩展实体方法 { MODEL.FormatModel.AjaxMsgModel ajaxM = new MODEL.FormatModel.AjaxMsgModel() { Statu = "err", Msg = "失败~~!" }; //1.2验证(自己做) if (!ModelState.IsValid) { } //1.3通过操作上下文获取 用户业务接口对象,调用里面的登陆方法! //BLLSession//数据仓储 MODEL.Ou_UserInfo usr = OperateContext.BLLSession.IOu_UserInfoBLL.Login(UserLogin.LoginNames, UserLogin.uPwd3);//扩展登录Login if (usr != null) { //2.1保存 用户数据(Session or Coookie) //为了安全考虑, MODEL.Ou_UserInfo代理类,改成真正的实体。再存入Cookie Session["aiafo2"] = usr; if (!UserLogin.isAllway)//如果选择了复选框,则使用cookie保存数据,要加密 { //2.1.2将用户id加密成字符串 string strCookieValue = Common.SecurityHelper.EncryptUserInfo(usr.uId.ToString());//调用票据加密 //2.1.3创建cookie HttpCookie cookie = new HttpCookie("aiafo2", strCookieValue);//用户id存入Cookie cookie.Path = "/admin/"; cookie.Expires = DateTime.Now.AddDays(1);//失效时间是一天 Response.Cookies.Add(cookie);//发回去 } //2.2查询当前用户的权限,并将权限存入 Session================= List<MODEL.Ou_Permission> listPermission = MVCOA.Helper.OperateContext.GetUserPermission(usr.uId);//usr.uId是用户id Session["OuPermossopm"] = listPermission;//存入Session对象================= ajaxM.Statu = "ok";//Statu状态 ajaxM.Msg = "登陆成功~";//Msg消息 ajaxM.BackUrl = "/admin/admin/index"; //ajaxM.BackUrl = "/home/index"; } return Json(ajaxM); } #endregion #region 2.0 显示管理首页+ ActionResult Index() /// <summary> /// /// <summary> /// 2.0 显示管理首页 /// </summary> /// <returns></returns> /// </summary> /// <returns></returns> public ActionResult Index() { return View(); } #endregion #region 3.0 根据当前登陆用户 权限 生成菜单 +GetMenuData() [Common.Attributes.Skip] public ActionResult GetMenuData() { return Json(MVCOA.Helper.OperateContext.CurUserPersion); } #endregion } }
登陆视图模型:扩展出来的
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MODEL.ViewModel { public class uLoginName { [Required] public string LoginNames { get; set; } [Required] public string Pwd3 { get; set; } public bool isAllway { get; set; } } }
=====================================登陆重构1=============================
1.登陆完后做权限严重
1.1.ajax提交过来:返回消息,让重新登陆。
1.2.表单提交过来,直接让重定向。统一他们的操作方式。
2.重构上下文OperateContext
#region 0.1http上下文+Http上下文 及 相关属性 /// <summary> /// http上下文 /// </summary> public static HttpContext Context { get { return HttpContext.Current; } } /// <summary> /// http上下文 /// </summary> HttpResponse Response { get { return Context.Response; } } HttpRequest Request { get { return Context.Request; } } HttpSessionState Seesion { get { return Context.Session; } } #endregion
2.操作上下文的操作方式要大的改变,我们之前是静态的,自己做测试,没有并发。如果并发量高,我们还是担心。
2.1所以把当前的访问方式改成实例。即要操作方法,操作也不需要去new。操作可以直接点出来。
2.2提供一个静态属性,在里面new就可以了。
如图上下文对象operateContext:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MODEL; using System.Web; using System.Web.SessionState; namespace MVCOA.Helper { /// <summary> /// 操作上下文 /// </summary> public class OperateContext { #region 常量 //常量本质是静态变量,编译的时候会被替换掉 const string Admin_CookiePath = "/admin/"; const string Admin_InfoKey = "ainfo"; const string Admin_PermissionKey = "apermission"; const string Admin_LogicSessionkey = "BLLSession"; #endregion #region 0.0 静态构造函数 初始化【操作上下文对象】+ static OperateContext() /// <summary> /// 静态构造函数 初始化 一个【操作上下文对象】 /// </summary> static OperateContext() { Current = new OperateContext(); } #endregion #region 1.0 当前操作上下文+ static OperateContext Current /// <summary> /// 操作上下文 /// </summary> static OperateContext Current { get;//获取属性的值 private set;//写属性的值 } #endregion #region 0.1http上下文+Http上下文 及 相关属性 /// <summary> /// http上下文 /// </summary> public static HttpContext Context { get { return HttpContext.Current; } } /// <summary> /// http上下文 /// </summary> HttpResponse Response { get { return Context.Response; } } HttpRequest Request { get { return Context.Request; } } HttpSessionState Seesion { get { return Context.Session; } } #endregion
=====================================登陆重构2=============================
1.操作上下文。这时我们可以通过OperateContext.Current线程来操作上下文。( OperateContext工厂)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MODEL; using System.Web; using System.Web.SessionState; using System.Runtime.Remoting.Messaging; namespace MVCOA.Helper { /// <summary> /// 操作上下文 /// </summary> public class OperateContext { #region 常量 //常量本质是静态变量,编译的时候会被替换掉 const string Admin_CookiePath = "/admin/"; const string Admin_InfoKey = "ainfo"; const string Admin_PermissionKey = "apermission"; const string Admin_LogicSessionkey = "BLLSession"; #endregion #region 1.0 当前操作上下文+ static OperateContext Current /// <summary> /// 获取当前 静态操作上下文(从当前服务器处理线程中获取 上下文),针对一个请求,我有一个单独的操作上下文对象。 /// </summary> public static OperateContext Current { get { OperateContext oContext= CallContext.GetData(typeof(OperateContext).Name)as OperateContext; if (oContext == null)//如果是null,创建 { oContext = new OperateContext(); CallContext.SetData(typeof(OperateContext).Name, oContext);//放回 } return oContext; } } #endregion #region 0.1http上下文+Http上下文 及 相关属性 /// <summary> /// http上下文 /// </summary> public static HttpContext Context { get { return HttpContext.Current; } } /// <summary> /// http上下文 /// </summary> HttpResponse Response { get { return Context.Response; } } HttpRequest Request { get { return Context.Request; } } HttpSessionState Seesion { get { return Context.Session; } } #endregion /// <summary> /// 业务仓储----------------IBLL.IBLLSession仓储接口; DI.SpringHelper.GetObject<T>()//Spring.Net上下文容器(工厂) /// </summary> public IBLL.IBLLSession BLLSession = null; #region 02.实例构造函数 初始化 业务仓储 public OperateContext() { BLLSession = DI.SpringHelper.GetObject<IBLL.IBLLSession>("BLLSession"); } #endregion #region 1.0根据用户id查询用户权限+List<MODEL.Ou_Permission> GetUserPermission(int usrId) public static List<MODEL.Ou_Permission> GetUserPermission(int usrId) { //BLLSession.IOu_UserRoleBLL.GetListBy(ur => ur.urUId == usrId);//查询角色id //1.0根据用户 id 查到 该用户的 角色id List<int> listRoleId = OperateContext.Current.BLLSession.IOu_UserRoleBLL.GetListBy(ur => ur.urUId == usrId).Select(ur => ur.urRId).ToList();//查询用户角色id // //2.0根据角色id查询角色 权限id //List<int> listPerIds = new List<int>(); //foreach (int roleId in listRoleId)//3.0遍历所有角色 //{ //4.查询所有的角色权限id,然后加到listRoleId角色id集合上 // BLLSession.IOu_RolePermissionBLL.GetListBy(rp => rp.rpPId == roleId).ForEach(rp => listRoleId.Add(roleId)); //} //2.0根据角色id查询角色 权限id List<int> listPerIds = OperateContext.Current.BLLSession.IOu_RolePermissionBLL.GetListBy(rp => listRoleId.Contains(rp.rpRId)).Select(rp => rp.rpRId).ToList(); //3.0查询所有角色数据(权限) List<MODEL.Ou_Permission> listPermission = OperateContext.Current.BLLSession.IOu_PermissionBLL.GetListBy(p => listPerIds.Contains(p.pid)).Select(p => p.ToPOCO()).ToList(); //-------------B.根据用户特权查询 //b.1查询 用户特权id List<int> vipPerIds = OperateContext.Current.BLLSession.IOu_UserVipPermissionBLL.GetListBy(vip => vip.vipUserId == usrId).Select(vip => vip.vipPermission).ToList(); //b.2 查询 特权数据 List<MODEL.Ou_Permission> listPermssion2 = OperateContext.Current.BLLSession.IOu_PermissionBLL.GetListBy(p => vipPerIds.Contains(p.pid)).Select(p => p.ToPOCO()).ToList(); //------C.将连个权限集合 合并(将集合2的权限数据 添加到 集合1中) listPermssion2.ForEach(p => { listPermission.Add(p); }); return listPermission.OrderBy(u => u.pOrder).ToList(); } #endregion public static List<MODEL.EasyUIModel.TreeNode> CurUserPersion { //3.1 从Session中获取权限 get { List<MODEL.Ou_Permission> LitPer = Context.Session["aPermission"] as List<MODEL.Ou_Permission>; //3.2将权限数据转成easyUi Tree的数据 // MODEL.EasyUIModel.Tree treeObj = new MODEL.EasyUIModel.Tree() // { // animate = true, // cascadeCheck = false, // onlyLeafCheck = true, // dnd = false, // data = new List<MODEL.EasyUIModel.TreeNode>() // }; //return treeObj.data = MODEL.Ou_Permission.ToTreenodes(LitPer); return MODEL.Ou_Permission.ToTreenodes(LitPer); } } } }

浙公网安备 33010602011771号