定义基类控制器的好处:把一些公用的信息抽象出来供继承的子类使用,如:公用异常捕获方法,登录信息失效后的重定向跳转等等。
定义BaseController和BaseAdminController,BaseAdminController继承BaseController
1、BaseController 作用:重写异常捕获方法
/// <summary>
/// 异常时处理
/// </summary>
/// <param name="filterContext"></param>
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 作用:定义后台 用户信息 、登录失效后的跳转
/// <summary>
/// 后台控制器
/// </summary>
public class BaseAdminController : BaseController
{
/// <summary>
/// 当前用户信息
/// </summary>
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 ,就可以使用其中的功能了,非常方便