NSS_03 过滤器

asp.net mvc3有四类过滤器:授权, 操作,结果, 异常。操行的顺序为:授权,操作,结果,异常。 

首先看一下TempData: 数据只能经过至多一次的Controller传递, 并且每个元素至多只能被访问一次,访问以后,自动删除。一般用于临时的缓存内容或抛出错误页面时传递错误消息,所以异常信息的传递就用TempData了。

在项目中我们只用到授权类的验证用户是否登录功能, 及异常类的错误日志记录功能。可以继承系统默认实现的抽象类AuthorizeAttribute, HandleErrorAttribute

  • 是否登录:
public override void OnAuthorization(AuthorizationContext filterContext)
        {
            HttpContextBase context = filterContext.HttpContext;

            if (null == context.Session["User"])
            {
                filterContext.Result = new RedirectResult("~/Home/ReLogin");
            }

            //base.OnAuthorization(filterContext);
        }
  • 异常处理
public override void OnException(ExceptionContext filterContext)
        {
            Exception ex = filterContext.Exception;

            //记录日志ex.Message
            ILog log = LogManager.GetLogger("Exception");
            log.Error(ex.Message);
            log.Error(ex.StackTrace);
       TempData["errMsg"] = ex.Message;

            filterContext.ExceptionHandled = true;

            filterContext.Result = new RedirectResult("~/Home/ErrorMsg");

            //base.OnException(filterContext);
        }
  • 最后在相应的action中返回类似{success: false, errType: **, errMsg: TempData["errMsg"] as string},然后在客户端做相应处理, 这个方法比较笨啊, 客户端要做很多重复的工作, 很笨, 不过目前也只能想到这里了, 以后熟悉了再优化吧。
  • 针对是否登录, 因为在刷新时如果会话为空则会弹出登录框, 所以检测到未登录的情况,就刷新一下页面就可以了,如下:
window.location.reload();

[摘自http://msdn.microsoft.com/zh-cn/library/gg416513(v=vs.98).aspx

原文地址:https://www.cnblogs.com/taotaonwsuaf/p/3212500.html