各们同学,先请看MVC2过滤器和MVC3过滤器的区别!
1.例如,如果我们使用AJAX,发送重定向可能会导致登录
出现在 中间 的 用户 浏览 任何网页 的 页面 。 幸运的是, 我们 可以重写HandleUnauthorizedRequest AuthorizeAttribute类创建自定义策略的方法。
namespace MvcFilters.Infrastructure.Filters {
public class AjaxAuthorizeAttribute : AuthorizeAttribute {
protected override void HandleUnauthorizedRequest(AuthorizationContext context) {
if (context.HttpContext.Request.IsAjaxRequest()) {
UrlHelper urlHelper = new UrlHelper(context.RequestContext);
context.Result = new JsonResult {
Data = new {
Error = "NotAuthorized",
LogOnUrl = urlHelper.Action("LogOn", "Account")
}, JsonRequestBehavior = JsonRequestBehavior.AllowGet};
} else {
base.HandleUnauthorizedRequest(context);
}
}
}
}
2.Exception Filter
public class MyExceptionAttribute: FilterAttribute, IExceptionFilter {
public void OnException(ExceptionContext filterContext) {
if (!filterContext.ExceptionHandled &&
filterContext.Exception is NullReferenceException) {
filterContext.Result = new RedirectResult("/SpecialErrorPage.html");
filterContext.ExceptionHandled = true;
}
}
}
3.使用HandleErrorAttribute过滤器
[HandleError(ExceptionType=typeof(NullReferenceException), View="SpecialError")]
public ActionResult Index() {}
注意HandleErrorAttribute过滤器的工作原理,只有当在Web.config中启用自定义错误
文件 - 例如,通过添加<customErrors mode="On"/>内的<system.web>节点。默认的自定义
错误模式仅限远程的,这意味着,在发展过程中,HandleErrorAttribute不会拦截
例外,但是当你部署到生产服务器,并从另一台计算机的请求,
HandleErrorAttribute将生效。要看到最终用户将会看到,确保你设置的自定义
错误模式为开。
4.行为和结果过滤器
public interface IActionFilter {
void OnActionExecuting(ActionExecutingContext filterContext);//调用OnActionExecuting的方法
动作方法之前被调用
void OnActionExecuted(ActionExecutedContext filterContext);//OnActionExecuted的方法后,该操作方法
被调用
OnResultExecuting
OnResultExecuted
}
在OnActionExecuting取消请求
public class MyActionFilterAttribute : FilterAttribute, IActionFilter {
public void OnActionExecuting(ActionExecutingContext filterContext) {
if (!filterContext.HttpContext.Request.IsSecureConnection) {
filterContext.Result = new HttpNotFoundResult();
}
}
public void OnActionExecuted(ActionExecutedContext filterContext) {
// do nothing
}
常用的IAuthorizationFilter,IActionFilter,IResultFilter,和IExceptionFilter接口。
5.全局过滤器适用于所有在您的应用程序中的行动方法。我们使之成为一个普通的过滤器
全局过滤器通过在Global.asax RegisterGlobalFilters方法
public class MvcApplication : System.Web.HttpApplication {
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new HandleErrorAttribute());
filters.Add(new ProfileAllAttribute());
filters.Add(new HandleErrorAttribute() {
//这也是一种方式
filters.Add(new HandleErrorAttribute() {
ExceptionType = typeof(NullReferenceException),
View = "SpecialError"
});
}
订购过滤器执行
namespace MvcFilters.Infrastructure.Filters {
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple=true)]
public class SimpleMessageAttribute : FilterAttribute, IActionFilter {
public string Message { get; set; }//属性
public void OnActionExecuting(ActionExecutingContext filterContext) {
filterContext.HttpContext.Response.Write(
string.Format("[Before Action: {0}]", Message));
}
public void OnActionExecuted(ActionExecutedContext filterContext) {
filterContext.HttpContext.Response.Write(
string.Format("[After Action: {0}]", Message));
}
}
}
在过滤器中使用的顺序属性请看第二篇。谢谢