第13章_了解MVC3中Filters(第一篇)过滤器
2011-09-18 23:32
225 查看
各们同学,先请看MVC2过滤器和MVC3过滤器的区别!
1.例如,如果我们使用AJAX,发送重定向可能会导致登录
出现在中间的用户浏览任何网页的页面。幸运的是,我们可以重写
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));
}
}
}
在过滤器中使用的顺序属性请看第二篇。谢谢
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));
}
}
}
在过滤器中使用的顺序属性请看第二篇。谢谢
相关文章推荐
- 第13章_了解MVC3中Filters(第二篇)过滤器执行顺序
- HBase查询(3)---Decorating Filters装饰性过滤器
- FilterConfig.RegisterGlobalFilters 全局过滤器的用法
- Vue 过滤器filters及基本用法
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】
- ASP.NET MVC Filters 4种默认过滤器的使用
- vue 指令 v-html 中使用过滤器filters功能
- Vue中,methods中调用filters里的过滤器
- 第一篇: mina框架初了解
- Hibernate 过滤器(filters)
- fiddler-filters过滤器
- vue从入门到进阶:过滤器filters(五)
- 深入了解webkit内核第一篇:JavaScript引擎深度解析
- 你真的了解单例模式吗?你真的认为单例模式很简单吗? 第一篇
- Vue filters过滤器
- Vue filters过滤器的使用方法
- 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备
- PHP过滤器之审查过滤器(Sanitize filters)
- 深入了解webkit内核第一篇:JavaScript引擎深度解析
- 意图和意图过滤器Intents and Intent Filters