actionfilterattribute是什么类
1个回答
展开全部
正如你所知道的那样,它是一个类,且是一个继承了三个接口(其中两个为IActionFilter, IResultFilter)的抽象类。有关这个类及其所继承的三个接口的更详细的信息请参看MSDN。当然,如果你看完MSDN后还有疑问的话,请补充问题。
这里我只跟你说我们可以怎么用ActionFilterAttribute。正如前面所说,ActionFilterAttribute所继承的接口中有两个分别是IActionFilter, IResultFilter。
IActionFilter定义了两个方法,分别为OnActionExecuting()跟OnActionExecuted(),OnActionExecuting()方法在被过虑属性修饰了的action(接下来会讲解)执行前执行,而OnActionExecuted()方法则在此action执行之后执行。
对于地IResultFilter也定义了两个方法,分别为OnResultExecuting()跟OnResultExecuted()。OnResultExecuting()在被过虑属性修饰了的action返回的ActionResult被执行前执行,OnResultExecuted()在此ActionResult被执行后执行。
现在可以理解,ActionFilterAttribute便继承到了以上提到的四个On...()方法。但ActionFilterAttribute是一个抽象方法,它不会具体去实现这四个方法(虽然它可以),剩下的工作便要我们自己去完成了。
根据前面的叙述,再结合以下例子(例子自
《Pro ASP.NET MVC 2 Framework》(好书。。)),希望能让你更加容易理解。
定义一个继承自ActionFilterAttribute的类ShowMessageAttribute如下:
public class ShowMessageAttribute : ActionFilterAttribute
{
public string Message { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("[BeforeAction " + Message + "]");
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("[AfterAction " + Message + "]");
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("[BeforeResult " + Message + "]");
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("[AfterResult " + Message + "]");
}
}
定义一个controller如下:
public class FiltersDemoController : Controller
{
[ShowMessage/*ShowMessageAttribute的缩写*/(Message = "Howdy")]
public ActionResult SomeAction()/*这个就是我刚刚说的被过虑属性修饰的action,就是在此action之上放了个“[某属性。。]”*/
{
Response.Write("Action is running");
return Content("Result is running");
}
}
现在,当我们访问FiltersDemoController/SomeAction时,我们将得到以下结果:
[BeforeAction Howdy]Action is running[AfterAction Howdy]
[BeforeResult Howdy]Result is running[AfterResult Howdy]
至此,希望你已经明白了“ActionFilterAttribute是做什么的”。如果对以上例子尚有疑问,请补充问题,希望我还能解答。。
当然,故事远非如此,接下来再跟你讲一些更实用一点的东西。。
显然我们并不希望在一个action或一个result(of type ActionResult)执行或被执行完之后只是简单地打印几个字符串,更为划得来的是记录一些像异常之类的什么东西。。
比如,在上面的例子中,若SomeAction()的执行过程中抛出了异常,那么可以修改ShowMessageAttribute过虑属性的OnActionExecuted()方法,让此方法捕获、处理并记录此异常,并把客户导航到一个友好的报错页面。。
当然,对于过虑异常,还有另一个叫HandleErrorAttribute(实现接口IExceptionFilter)的东西,这个是可以直接用的。。
再补充一点点就是,对于异常的处理,ActionFilterAttribute跟HandleErrorAttribute的做法并不相同,在ActionFilterAttribute(其实是自己写的继承自此过虑类的过虑类)中filterContext.ExceptionHandled被置为true的异常便被吞(swallow)掉了,意思就是此异常不会再被任何IExceptionFilter实例及上层ActionFilterAttribute发现捕获。而在IExceptionFilter实例中标为已处理(filterContext.ExceptionHandled=true)的异常可以被任何喜欢它的地方发现。。
虽然你问的问题我已经解答了,尽管不知道有没有讲清楚,但仅这一点点东西就有太多东西要注意了,希望哪天我能把书上有关这点的知道总结到我的空间。。
如果不明白的话,请补充问题,希望我能帮到你。
如果这对你有帮助话,请将此标为最佳答案,谢谢。
这里我只跟你说我们可以怎么用ActionFilterAttribute。正如前面所说,ActionFilterAttribute所继承的接口中有两个分别是IActionFilter, IResultFilter。
IActionFilter定义了两个方法,分别为OnActionExecuting()跟OnActionExecuted(),OnActionExecuting()方法在被过虑属性修饰了的action(接下来会讲解)执行前执行,而OnActionExecuted()方法则在此action执行之后执行。
对于地IResultFilter也定义了两个方法,分别为OnResultExecuting()跟OnResultExecuted()。OnResultExecuting()在被过虑属性修饰了的action返回的ActionResult被执行前执行,OnResultExecuted()在此ActionResult被执行后执行。
现在可以理解,ActionFilterAttribute便继承到了以上提到的四个On...()方法。但ActionFilterAttribute是一个抽象方法,它不会具体去实现这四个方法(虽然它可以),剩下的工作便要我们自己去完成了。
根据前面的叙述,再结合以下例子(例子自
《Pro ASP.NET MVC 2 Framework》(好书。。)),希望能让你更加容易理解。
定义一个继承自ActionFilterAttribute的类ShowMessageAttribute如下:
public class ShowMessageAttribute : ActionFilterAttribute
{
public string Message { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("[BeforeAction " + Message + "]");
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("[AfterAction " + Message + "]");
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("[BeforeResult " + Message + "]");
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("[AfterResult " + Message + "]");
}
}
定义一个controller如下:
public class FiltersDemoController : Controller
{
[ShowMessage/*ShowMessageAttribute的缩写*/(Message = "Howdy")]
public ActionResult SomeAction()/*这个就是我刚刚说的被过虑属性修饰的action,就是在此action之上放了个“[某属性。。]”*/
{
Response.Write("Action is running");
return Content("Result is running");
}
}
现在,当我们访问FiltersDemoController/SomeAction时,我们将得到以下结果:
[BeforeAction Howdy]Action is running[AfterAction Howdy]
[BeforeResult Howdy]Result is running[AfterResult Howdy]
至此,希望你已经明白了“ActionFilterAttribute是做什么的”。如果对以上例子尚有疑问,请补充问题,希望我还能解答。。
当然,故事远非如此,接下来再跟你讲一些更实用一点的东西。。
显然我们并不希望在一个action或一个result(of type ActionResult)执行或被执行完之后只是简单地打印几个字符串,更为划得来的是记录一些像异常之类的什么东西。。
比如,在上面的例子中,若SomeAction()的执行过程中抛出了异常,那么可以修改ShowMessageAttribute过虑属性的OnActionExecuted()方法,让此方法捕获、处理并记录此异常,并把客户导航到一个友好的报错页面。。
当然,对于过虑异常,还有另一个叫HandleErrorAttribute(实现接口IExceptionFilter)的东西,这个是可以直接用的。。
再补充一点点就是,对于异常的处理,ActionFilterAttribute跟HandleErrorAttribute的做法并不相同,在ActionFilterAttribute(其实是自己写的继承自此过虑类的过虑类)中filterContext.ExceptionHandled被置为true的异常便被吞(swallow)掉了,意思就是此异常不会再被任何IExceptionFilter实例及上层ActionFilterAttribute发现捕获。而在IExceptionFilter实例中标为已处理(filterContext.ExceptionHandled=true)的异常可以被任何喜欢它的地方发现。。
虽然你问的问题我已经解答了,尽管不知道有没有讲清楚,但仅这一点点东西就有太多东西要注意了,希望哪天我能把书上有关这点的知道总结到我的空间。。
如果不明白的话,请补充问题,希望我能帮到你。
如果这对你有帮助话,请将此标为最佳答案,谢谢。
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询