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