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);
           }
            
        }
    }
}

 

posted @ 2017-03-20 18:43  狼牙者.net  阅读(477)  评论(0)    收藏  举报