您的位置:首页 > 其它

第13章_了解MVC3中Filters(第一篇)过滤器

2011-09-18 23:32 225 查看
各们同学,先请看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));

}

}

}

在过滤器中使用的顺序属性请看第二篇。谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息