zoukankan      html  css  js  c++  java
  • ASP.NET MVC实践系列9filter原理与实践

    filter实际上是一个特性(attribute),它提供了一种向controller 或 action中添加某些任务的方法,当controller 或 action被调用时,会触发filter中定义的相应方法。filter应该算AOP的一种实现方式,关于AOP的内容大家可以参考张逸的文章http://www.cnblogs.com/wayfarer/articles/241024.html,图文并茂对AOP讲解的十分清楚。所以我们就可以在某种程度上利用filter来分解横向和纵向的应用,比方说日志,权限,缓存,防盗链等等应用。

    一、我们先来看看ASP.NET MVC 框架提供的几种默认filter类型:
    1、Authorize:

    准备工作:进入C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727文件夹,双击aspnet_regsql.exe选择好相应的数据库,创建membership,AuthorizeAttribute使用membership来进行权限验证的,所以我们需要先在membership中准备一个用户lfm,一个角色Admin,我们使用studio的项目-》ASP.NET配置创建即可。

      [Authorize(Roles="Admin")]
            
    public ActionResult Index()
            {
                ViewData[
    "Message"= "Welcome to ASP.NET MVC!";

                
    return View();
            }

    如果lfm不属于Admin角色时Index页是不能访问的

    2、OutputCache:

     [OutputCache(Duration=60, VaryByParam="none")]
            
    public ActionResult About()
            {
                
    return View();
            }

    然后我们修改About加入:

     <%=DateTime.Now.ToString() %>

    我们会发现在一分钟内我们刷新About页面其输出并不改变。这个和webform中的页面缓存机制非常相似。

    这里我们也可以统一的配置时间和条件

    配置文件

    Controler中输入

      [OutputCache(CacheProfile="MyProfile")]
            
    public ActionResult About()
            {
                
    return View();
            }

    3、Exception

    Exception

    标明HandleError属性后的Action,当内部出现异常时会根据异常类型跳转到相应的View,这里需要注意的是上面的源码在开发期无法看到效果,必须部署到iis上才能看到效果。实际上这个简单处理在项目中用处不大,一般我们都会写自己的异常处理方式,自定义异常处理我们一会再自定义filter中讲解。

    二、自定义filter实例:

    我们先来看一下跟filter相关的类结构:

    一般情况下我们自定义的filter都是继承FilterAttribute类然后再扩展相应的接口的,下面我们举几个例子:

    1、自定义异常处理

    自定义异常处理

    使用

    Controller

    浏览器中输入:http://localhost:3983/Home/GetView

    这样我们就可以根据自己的项目情况来处理异常了。

    2、监控Action运行时间的Timer

    TimerAttribute

    使用

     [Timer]
            
    public ActionResult TestTimer()
            {
                Thread.Sleep(
    100);
                
    return View();
            }

    页面显示:

    <%=ViewData["__Duration"]%>

    三、filter相关接口方法的执行顺序:

    根据上面的结构图我们知道跟filter相关的总共有四个接口,六个方法,这些方法如果在同一个类中实现时是有个优先级顺序的

    IAuthorizationFilter>IActionFilter>IResultFilter>IExceptionFilter
    接下来我们写个程序来验证这个顺序:

    TestOrder属性类

    使用

    [TestOrder]
            
    public ActionResult TestFilterOrder()
            {
               
    // throw new Exception("lfm");
                return View();
            }

    前端

    <%throw new Exception("异常出现"); %>

    这时候我们打开c:\test.txt得到的结果为:

    OnAuthorization
    OnActionExecuting
    OnActionExecuted
    OnResultExecuting
    OnResultExecuted
    OnException

    四、参考

    《Professional ASP.NET MVC 1.0》

    http://www.cnblogs.com/leoo2sk/archive/2008/11/05/1326655.html

    http://www.cnblogs.com/wayfarer/articles/241024.html

    http://www.cnblogs.com/chsword/archive/2009/03/12/zd_mvc6.html

    五、源码

    我的ASP.NET MVC实践系列

    ASP.NET MVC实践系列1-UrlRouting

    ASP.NET MVC实践系列2-简单应用

    ASP.NET MVC实践系列3-服务器端数据验证

    ASP.NET MVC实践系列4-Ajax应用

    ASP.NET MVC实践系列5-结合jQuery

    ASP.NET MVC实践系列6-Grid实现(上)

    ASP.NET MVC实践系列7-Grid实现(下-利用Contrib实现)

    ASP.NET MVC实践系列8-对查询后分页处理的解决方案

    其他:

    在ASP.NET MVC中对表进行通用的增删改

  • 相关阅读:
    ViewState EnableViewState 禁用与使用心得
    ashx获取处理数据的简单例子
    移动标签(marquee)属性详解
    SQL Server 2008 R2 企业版/开发版/标准版(中英文下载,带序列号)
    C#,Dictionary,asp.net 字典 用法及简单操作
    .net 后台提交表单,获取返回结果
    ASP.NET : 如何将服务端的多个文件打包下载
    puppet原理及配置
    linux开机启动详细流程
    SHELL日志分析 实例一
  • 原文地址:https://www.cnblogs.com/nuaalfm/p/1609752.html
Copyright © 2011-2022 走看看