AJax技术

ASP.Net MVC开发基础学习笔记:四、校验、AJAX与过滤器(3)

字号+ 作者:H5之家 来源:H5之家 2017-03-28 09:11 我要评论( )

①因此,我们首先在Models中新建一个类,取名为:MyActionFilterAttribute(以Attribute结尾比较符合编码规范),并使其继承自ActionFilterAttribute,然后重写基类所提供的虚方法: public class MyActionFilterAt

  ①因此,我们首先在Models中新建一个类,取名为:MyActionFilterAttribute(以Attribute结尾比较符合编码规范),并使其继承自ActionFilterAttribute,然后重写基类所提供的虚方法:

public class MyActionFilterAttribute : ActionFilterAttribute { public string Name { get; set; } Action 执行之前先执行此方法 OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); HttpContext.Current.Response.Write(+ Name); } Action执行之后 OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); HttpContext.Current.Response.Write(+ Name); } ActionResult执行之前先执行此方法 OnResultExecuting(ResultExecutingContext filterContext) { base.OnResultExecuting(filterContext); HttpContext.Current.Response.Write(+ Name); } ActionResult执行之后先执行此方法 OnResultExecuted(ResultExecutedContext filterContext) { base.OnResultExecuted(filterContext); HttpContext.Current.Response.Write(+ Name); } }

  这里我们重写了四个虚方法,他们各自代表了在Action执行之前和之后需要执行的业务逻辑,以及在Result执行之前和之后需要执行的业务逻辑。这里的Result主要是指我们在Action中进行return 语句返回结果时(例如:return Content("Hello Filter!");),之前和之后要执行的逻辑处理。

  比如:我们想要在每个Action执行之前进行用户是否登录的校验,可以在OnActionExecuting中判断用户Session是否存在,如果存在则继续执行Action的具体业务代码,如果不存在则重定向页面到登陆页,后边的Action业务代码不再执行。

  ②现在有了自定义的过滤器,我们怎么将其应用到Action中呢?这里有三种方式:

  一是给某个控制器的某个Action指定此Filter:

[MyActionFilter(Name = )] public ActionResult Filter() { Response.Write(); ); }

  二是给某个控制器的所有Action指定此Filter:

[MyActionFilter(Name=)] public class HomeController : Controller { }

  但是,要注意的是:如果既给Controller指定了Filter,又给该Controller中的某个Action指定了Filter,那么具体的这个Action以离其定义最近的Filter为准,也就是一个优先级的顺序问题:Action的Filter优先级高于Controller的Filter。

  三是给此项目中的所有控制器即全局指定此Filter:在App_Start中更改FilterConfig类,此种方式优先级最低。

RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); // 注册自定义Action过滤器:优先级最低,但是可以作用到所有的控制器和Action filters.Add( }); }

  ③现在我们来看看具体的效果:

  可以看到,我们的/Home/Filter这个Action中只有两句代码,一句Response.Write,另一句是return Content();在Response.Write之前执行了OnActionExecuting的过滤器方法,之后则执行了OnActionExecuted的过滤器方法;我们刚刚说了,在Action中的return语句代表了Result,那么在Result之前执行了OnResultExecuting过滤器方法,之后则执行了OnResultExecuted过滤器方法。这里仅仅是为了展示,在实际开发中是需要写一些具体的业务逻辑处理的,例如:判断用户的登录状态,记录用户的操作日志等等。

  (2)Exception Filter

  ①同样,在Models中新建一个类,取名为:MyExceptionFilterAttribute,并使其继承自HandleErrorAttribute。

public class MyExceptionFilterAttribute : HandleErrorAttribute { OnException(ExceptionContext filterContext) { base.OnException(filterContext); HttpContext.Current.Response.Redirect(); } }

  这里,重写基类的OnException方法,这里仅仅为了演示效果,没有对异常进行处理。在实际开发中,需要获取异常对象,并将其记录至日志中。例如,下面一段代码:

OnException(ExceptionContext filterContext) { base.OnException(filterContext); strException = filterContext.Exception.Message; if (!string.IsNullOrEmpty(strException)) { //使用Log4Net记录异常信息 Exception exception = filterContext.Exception; if (exception != null) { LogHelper.WriteErrorLog(strException, exception); } else { LogHelper.WriteErrorLog(strException); } }        filterContext.HttpContext.Response.Redirect("~/GlobalErrorPage.html"); }

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • ASP.NET WebForm使用Ajax

    ASP.NET WebForm使用Ajax

    2017-03-24 17:00

  • 《学习ASP.NET 2.0和AJAX》pdf书下载

    《学习ASP.NET 2.0和AJAX》pdf书下载

    2017-03-16 14:04

  • Asp.net中的AJAX学习记录之二 体会AJAX页面刷新的不同

    Asp.net中的AJAX学习记录之二 体会AJAX页面刷新的不同

    2017-03-12 18:03

  • ASP.NET AJAX学习记要(1)-如何下手

    ASP.NET AJAX学习记要(1)-如何下手

    2017-03-11 12:03

网友点评
r