从零开始写C# MVC框架之--- 定义基类控制器、实现全局异常捕获

定义基类控制器的好处:把一些公用的信息抽象出来供继承的子类使用,如:公用异常捕获方法,登录信息失效后的重定向跳转等等。

从零开始写C# MVC框架之--- 定义基类控制器、实现全局异常捕获_第1张图片

定义BaseController和BaseAdminController,BaseAdminController继承BaseController

1、BaseController 作用:重写异常捕获方法

        /// 
        /// 异常时处理
        /// 
        /// 
        protected override void OnException(ExceptionContext filterContext)
        {
            string msg = filterContext.Exception.Message;
            if (!(filterContext.Exception is ZyException))
            {
                var controllerName = filterContext.RouteData.Values["controller"].ToString();
                var actionName = filterContext.RouteData.Values["action"].ToString();
                var areaName = filterContext.RouteData.DataTokens["area"];
                var erroMsg = string.Format("页面未捕获的异常:Area:{0},Controller:{1},Action:{2}", areaName, controllerName, actionName);
                Log.Error(erroMsg, filterContext.Exception);
                msg = "系统内部异常";
            }
            else
                Log.Info("", filterContext.Exception);

            //将状态码更新为200,否则在Web.config中配置了CustomerError后,Ajax会返回500错误导致页面不能正确显示错误信息
            filterContext.HttpContext.Response.StatusCode = 200;
            filterContext.ExceptionHandled = true;
        }

2、BaseAdminController 作用:定义后台 用户信息 、登录失效后的跳转

    /// 
    /// 后台控制器
    /// 
    public class BaseAdminController : BaseController
    {
        /// 
        /// 当前用户信息
        /// 
        public Zy.Xn.Model.System.User CurrentUser
        {
            get
            {
                var user = (User)Session[CacheKeys.User_Info_Cache_Key];
                return user;
            }
        }


        protected override void OnAuthorization(AuthorizationContext filterContext)
        {
            //不能应用在子方法上
            if (filterContext.IsChildAction)
                return;

            if (CurrentUser == null)
            {
                if (Core.Helper.WebHelper.IsAjax())
                {
                    filterContext.Result = Json(new { success = false, msg = "登录超时,请重新登录!" });
                    return;
                }
                else
                {
                    var result = RedirectToAction("Redirect", "Login", new { area = "admin" });
                    filterContext.Result = result;
                    return;
                    //跳转到登录页
                }
            }
        }
    }

 
  

后台Web项目如;菜单、角色等基础 BaseAdminController ,就可以使用其中的功能了,非常方便


你可能感兴趣的:(从零开始写C#,MVC框架)