<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Asp.Net MVC3 簡單入門第一季(三)詳解Controller之Filter

      前言

      前面兩篇寫的比較簡單,剛開始寫這個系列的時候我面向的對象是剛開始接觸Asp.Net MVC的朋友,所以寫的盡量簡單。所以寫的沒多少技術含量。把這些技術總結出來,然后一簡單的方式讓更多的人很好的接受這是我一直努力的方向。后面會有稍微復雜點的項目!讓我們一起期待吧!

      此文我將跟大家介紹一下Asp.Net MVC3 Filter的一些用法。你會了解和學習到全局FileterAction Filter等常用用法。

      第一節:Filter知識儲備

      項目大一點總會有相關的AOP面向切面的組件,而MVC(特指:Asp.Net MVC,以下皆同)項目中呢Action在執行前或者執行后我們想做一些特殊的操作(比如身份驗證,日志,異常,行為截取等),而不想讓MVC開發人員去關心和寫這部分重復的代碼,那我們可以通過AOP截取實現,而在MVC項目中我們就可以直接使用它提供的Filter的特性幫我們解決,不用自己實現復雜的AOP了。

      Asp.Net MVC提供了以下幾種默認的Filter

      Filter Type

      實現接口

      執行時間

      Default Implementation

      Authorization filter

      IAuthorizationFilter

      在所有FilterAction執行之前執行

      AuthorizeAttribute

      Action filter

      IActionFilter

      分別在Action執行之前和之后執行。

      ActionFilterAttribute

      Result filter

      IResultFilter

      分別在Action Result執行之后和之前

      ResultFilterAttribute

      Exception filter

      IExceptionFilter

      只有在filter,

      或者 action method, 或者 action result 拋出一個異常時候執行

       

      HandleErrorAttribute

      大家注意一點,Asp.Net MVC提供的ActionFilterAttribute默認實現了IActionFilter和IResultFilter。而ActionFilterAttribute是一個Abstract的類型,所以不能直接使用,因為它不能實例化,所以我們想使用它必須繼承一下它然后才能使用,下圖所示的是ActionFilterAttribute的實現:

      所以我們在實現了ActionFilterAttribute,然后就可以直接重寫一下父類的方法如下:

      publicvirtualvoid OnActionExecuted(ActionExecutedContext filterContext);//在Action執行之后執行

      publicvirtualvoid OnActionExecuting(ActionExecutingContext filterContext); //在Action執行前執行

      publicvirtualvoid OnResultExecuted(ResultExecutedContext filterContext);//在Result執行之后

      publicvirtualvoid OnResultExecuting(ResultExecutingContext filterContext); //在Result執行之前

      然后我們就可以直接在ActionResult執行之前之后分別做一些操作。

      第二節:Action Filter實戰

      光說不練假把式,那現在我們就直接做一個例子來實際演示一下。

      首先我們添加一個普通的類,直接上代碼吧:

      publicclass DemoActionAttributeFilter : ActionFilterAttribute
      {
      publicstring Message { get; set; }

      publicoverridevoid OnActionExecuted(ActionExecutedContext filterContext)
      { //在Action執行之后執行 輸出到輸出流中文字:After Action execute xxx
      filterContext.HttpContext.Response.Write(
      @"<br />After Action execute"+"\t "+ Message);
      base.OnActionExecuted(filterContext);
      }

      publicoverridevoid OnActionExecuting(ActionExecutingContext filterContext)
      { //在Action執行前執行
      filterContext.HttpContext.Response.Write(
      @"<br />Before Action execute"+"\t "+ Message);
      base.OnActionExecuting(filterContext);
      }

      publicoverridevoid OnResultExecuted(ResultExecutedContext filterContext)
      { //在Result執行之后
      filterContext.HttpContext.Response.Write(
      @"<br />After ViewResult execute"+"\t "+ Message);
      base.OnResultExecuted(filterContext);
      }

      publicoverridevoid OnResultExecuting(ResultExecutingContext filterContext)
      { //在Result執行之前
      filterContext.HttpContext.Response.Write(
      @"<br />Before ViewResult execute"+"\t "+ Message);
      base.OnResultExecuting(filterContext);
      }

      }

      寫完這個代碼后,我們回到Action上,打上上面的標記如下所示:

       

      [DemoActionAttributeFilter(Message ="action")]
      public ActionResult Index()
      { //Action 執行時往輸出流寫點代碼
      this.ControllerContext.HttpContext.Response.Write(@"<br />Action execute");
      return Content("Result Excut! ");
      }

      然后執行F5,頁面上則會顯示為:

      最終我們看到了在Action執行之前和之后都執行了我們的重寫的DemoActionAttributeFilter方法,Result執行前后也執行了我們的Filter的方法。

      總的執行順序是:

      Action執行前:OnActionExecuting方法先執行→Action執行→OnActionExecuted方法執行→OnResultExecuting方法執行→返回的ActionRsult中的executeResult方法執行→OnResultExecuted執行。最終顯示的效果就是如上圖所示。

      感覺很爽吧!呵呵!

      如果我們將此標簽打到Controller上的話,DemoActionAttributeFilter將作用到Controller下的所有的Action。例如如下代碼所示:

      [DemoActionAttributeFilter(Message ="controller")]
      publicclass HomeController : Controller
      {
      [DemoActionAttributeFilter(Message
      ="action")]
      public ActionResult Index()
      {
      this.ControllerContext.HttpContext.Response.Write(@"<br />Action execute");
      return Content("<br/>Result Excut! ");
      }
      }
       
      那就有個問題了我們再執行顯示的頁面會有什么情況呢?Controller上的Filter會執行嗎?那標簽的作用會執行兩次嗎?下面是最后的執行結果如下圖所示:

      結果說明:默認情況下Action上打了DemoActionAttributeFilter 標簽后,雖然在Controller上也打上了此標簽,但它只有Action上的標簽起作用了。

      Index 執行時,Filter的方法只執行了一次,而某些情況下我們也想讓Controller上的FilterAttribute也執行一次DemoActionAttributeFilter 

      那我們怎么才能讓Controller上的[DemoActionAttributeFilter(Message = "controller")]也起作用呢?

      答案是:我們只需在DemoActionAttributeFilter類的定義上打上標記[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]即可【下面類的最上面紅色字體部分】,也就是讓其成為可以多次執行的Action代碼如下: 

      [AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
      publicclass DemoActionAttributeFilter : ActionFilterAttribute
      {
      publicstring Message { get; set; }

      publicoverridevoid OnActionExecuted(ActionExecutedContext filterContext)
      {
      filterContext.HttpContext.Response.Write(
      @"<br />After Action execute"+"\t "+ Message);
      base.OnActionExecuted(filterContext);
      }

      publicoverridevoid OnActionExecuting(ActionExecutingContext filterContext)
      {
      filterContext.HttpContext.Response.Write(
      @"<br />Before Action execute"+"\t "+ Message);
      base.OnActionExecuting(filterContext);
      }

      publicoverridevoid OnResultExecuted(ResultExecutedContext filterContext)
      {
      filterContext.HttpContext.Response.Write(
      @"<br />After ViewResult execute"+"\t "+ Message);
      base.OnResultExecuted(filterContext);
      }

      publicoverridevoid OnResultExecuting(ResultExecutingContext filterContext)
      {
      filterContext.HttpContext.Response.Write(
      @"<br />Before ViewResult execute"+"\t "+ Message);
      base.OnResultExecuting(filterContext);
      }

      }

      然后我們執行的效果如圖所示:

      我們看到的結果是Controller上的ActionFilter先于Action上打的標記執行。同樣Result執行executeResult方法之前也是先執行Controller上的Filter標記中的OnResultexecuteing方法。

      最后的執行順序是:Controller上的OnActionExecuting→Action上的OnActionExecuting→Action執行→Action上的OnActionExecuted→Controller上的OnActionExecuted 

      到此Action就執行完畢了,我們看到是一個入棧出棧的順序。后面是Action返回ActionResult后執行了ExecuteResult方法,但在執行之前要執行Filter。具體順序為:

      接上面→Controller的OnResultExecuting方法→Action上的OnResultExecuting→Action返回ActionResult后執行了ExecuteResult方法→Action上的OnResultExecuted執行→Controller上的OnResultExecuted執行→結束

      第三節:Gloable Filter實戰

      又接著一個問題也來了,我們想有些公共的方法需要每個Action都執行以下,而在所有的Controller打標記是很痛苦的。幸好AspNet MVC3帶來了一個美好的東西,全局Filter。而怎么注冊全局Filter呢?答案就在Global.asax中。讓我們看以下代碼,我是如何將上面我們定義的DemoActionAttributeFilter 注冊到全局Filter中。上代碼: 

      publicclass MvcApplication : System.Web.HttpApplication
      {
      publicstaticvoid RegisterGlobalFilters(GlobalFilterCollection filters)
      {
      filters.Add(
      new HandleErrorAttribute());
      }

      publicstaticvoid RegisterRoutes(RouteCollection routes)
      {
      routes.IgnoreRoute(
      "{resource}.axd/{*pathInfo}");

      routes.MapRoute(
      "Default", // Route name
      "{controller}/{action}/{id}", // URL with parameters
      new { controller ="Home", action ="Index", id = UrlParameter.Optional } // Parameter defaults
      );

      }

      protectedvoid Application_Start()
      {
      AreaRegistration.RegisterAllAreas();
      GlobalFilters.Filters.Add(
      new DemoActionAttributeFilter() { Message = "Gloable" });
      RegisterGlobalFilters(GlobalFilters.Filters);

      RegisterRoutes(RouteTable.Routes);
      }
      }

      跟普通的MVC2.0中的Global.asax的區別就是紅色部分的代碼,我們看到代碼中我將自己定義的DemoActionAttributeFilter的實例加入到GlobalFilters.Filters集合中,然后下面一句就是注冊全局FilterRegisterGlobalFilters(GlobalFilters.Filters);

      這樣我們所有的ActionResult執行前后都會調用我們的DemoActionAttributeFilter的重寫的方法。

      再次運行我們的demo看到的結果是:

      我們看到的結果是全局的Action首先執行,然后才是Controller下的Filter執行,最后才是Action上的標簽執行。當然這是在DemoActionAttributeFilter類的定義上打上標記[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]的前提下。不然 如果Action打上了標簽跟Controller的相同則它只會執行Action上的Filter

      總結

      經過這一篇文章的介紹我們大體了解了Filter的使用方法,還了解到全局Filter的用法,尤其是當相同的Filter重復作用到同一個Action上時,如果沒有設置可多次執行的標簽那只有Action上的Filter執行,而Controller和全局Filter都被屏蔽掉,但是設置可多次執行,那首先執行全局Filter其次是Controller再次之就是Action上的Filter了。

       

      本文提供Word版本下載地址:https://files.cnblogs.com/fly_dragon/Filter%E5%AD%A6%E4%B9%A0.rar

       

      記于:201161423:23:47

       

       

      初識Asp.Net MVC2.0

      初識Asp.Net MVC2.0【續】

      Asp.Net MVC2.0 Url 路由入門---實例篇

      Asp.Net MVC2.0 Url 路由入門

      Asp.Net MVC3 簡單入門第一季(一)環境準備

      Asp.Net MVC3 簡單入門第一季(二)詳解Asp.Net MVC3項目

      Asp.Net MVC3 簡單入門第一季(三)詳解Controller之Filter

      Asp.Net MVC3 簡單入門第一季(四)詳解Request Processing Pipeline

      posted @ 2011-06-15 08:39  FlyDragon  閱讀(22438)  評論(40)    收藏  舉報
      主站蜘蛛池模板: 成人国产片视频在线观看| 最新亚洲人成网站在线影院| 美女黄18以下禁止观看| 国产精品自拍实拍在线看| 久久av无码精品人妻出轨| 中文字幕乱码中文乱码毛片 | 亚洲AV成人片不卡无码| 亚洲高清WWW色好看美女| 欧美嫩交一区二区三区| 浮妇高潮喷白浆视频| 亚洲欧美国产精品久久久久久久 | 日本中文字幕有码在线视频| 美女胸18下看禁止免费视频| 色老头亚洲成人免费影院| 蜜桃一区二区三区在线看| 在线观看亚洲精品国产| 国产粉嫩高中无套进入| 囯产精品一区二区三区线| 亚洲av无码乱码在线观看野外| 成在线人永久免费视频播放| 国产偷自视频区视频| 亚洲国产成人精品综合色| 国产精品熟女孕妇一区二区| 亚洲一区二区三区在线观看精品中文 | 少妇人妻偷人精品免费| 免费人成再在线观看视频| 日韩中文字幕在线不卡一区| 午夜成人精品福利网站在线观看| 国产日韩综合av在线| 国产一精品一av一免费| 狠狠色综合网站久久久久久久 | 精品国产欧美一区二区三区在线| 精品黄色av一区二区三区| 色成人亚洲| 亚洲午夜香蕉久久精品| 日本一区二区三区激情视频| 国产精品99久久免费| 亚洲精品成人一二三专区| 国产视频有码字幕一区二区| 国产一区二区三区精品综合| 精品尤物TV福利院在线网站|