ホームページ バックエンド開発 C#.Net チュートリアル Asp.Net MVCのフィルターの詳しい説明 学習まとめ(画像とテキストで詳しく解説)

Asp.Net MVCのフィルターの詳しい説明 学習まとめ(画像とテキストで詳しく解説)

Apr 01, 2017 am 11:13 AM
asp.net mvc フィルター

この記事では主に Asp.Net MVCの学習概要と Filter の詳細な説明を紹介します。編集者が非常に優れていると考えたので、参考として共有します。エディターで見てみましょう

1. フィルターの概要

1.1. フィルターとは何かを理解します

1. フィルターは、リクエスト処理パイプラインに追加のロジックを挿入します。横断的な懸念事項を実装するためのシンプルかつエレガントな方法を提供します。

2. MVC フレームワークのいわゆるフィルター (フィルター) は、ASP.NET プラットフォームの Request.Filters および Response.Filter

オブジェクトとは完全に異なり、主にリクエストと応答の送信を実装します。ストリーム。通常、フィルターと呼ばれるものは、MVC フレームワークのフィルターを指します。 3. フィルターは、

C#

の属性の実装に基づいて、いくつかのコード ロジックをリクエスト処理パイプラインに挿入できます。アクションの呼び出しを担当するクラス ControllerActionInvoker がアクションを呼び出して実行すると、アクションの属性がチェックされ、これらの属性が追加のコード挿入処理のために指定された インターフェース を実装しているかどうかが確認されます

1.2。その理由を理解します。フィルターが使用されているとします

小さなプロジェクトを作成し、その機能の 1 つとしてユーザー情報の管理が認証されたユーザーによって実行される必要があるとします。以下に示すように、認証リクエスト:

using MvcFilterDmo.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace MvcFilterDmo.Controllers
{
  public class HomeController : Controller
  {
    public ActionResult Index()
    {
      if (!Request.IsAuthenticated)
      {
        FormsAuthentication.RedirectToLoginPage();
      }
      //操作部分...
      return View();
    }
    public ActionResult Insert()
    {
      if (!Request.IsAuthenticated)
      {
        FormsAuthentication.RedirectToLoginPage();
      }
      //操作部分...
      return View();
    }
    public ActionResult Update()
    {
      if (!Request.IsAuthenticated)
      {
        FormsAuthentication.RedirectToLoginPage();
      }
      //操作部分...
      return View();
    }
    public ActionResult Delete()
    {
      if (!Request.IsAuthenticated)
      {
        FormsAuthentication.RedirectToLoginPage();
      }
      //操作部分...
      return View();
    }
    //其他Action操作方法
    //...
  }
}
ログイン後にコピー

上記のコードを見ると、このメソッドを使用してリクエストの認証を確認する際に多くの重複があることがわかります。これが、フィルターを使用することで同じ効果が得られる理由です。以下に示すように:

using MvcFilterDmo.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace MvcFilterDmo.Controllers
{
  [Authorize]
  public class HomeController : Controller
  {
    public ActionResult Index()
    {
      //操作部分...
      return View();
    }
    public ActionResult Insert()
    {
      //操作部分...
      return View();
    }
    public ActionResult Edit()
    { 
      //操作部分...
      return View();
    }
    public ActionResult Delete()
    {
      //操作部分...
      return View();
    }
    //其他Action操作方法
    //...
  }
}
ログイン後にコピー

フィルターは、リクエスト処理パイプラインに追加する追加メソッドを提供する .NET の属性 (属性) です。ここで Authorize フィルターを使用しても同じ効果を実現できますが、コードは明らかに以前よりも簡潔でエレガントになっています。

2. フィルターの使用

2.1. フィルターの基本的なタイプ

フィルター実装のメカニズム: MVC フレームワークは、アクションを呼び出す前に、その特性がアクションの定義に実装されているかどうかを確認します。メソッド (属性) が実装されている場合、この属性で定義されたメソッドがリクエスト処理パイプラインの適切なポイントで呼び出されます。

ActionFilterAttribute クラスは、IactionFilter インターフェイスと IResultFilter インターフェイスの両方を実装します。これは

抽象クラス

であり、実装を提供する必要があります。 AuthorizeAttribute クラスと HandleErrorAttribute クラスにはいくつかの便利な機能が含まれており、派生クラスを作成せずに使用できます。

2.2. フィルター アプリケーション、アプリケーション メソッド、および実行シーケンス

アプリケーション: フィルターは

コントローラー

に適用でき、コントロールに適用される場合、すべてのアクション メソッドを表します。すべてにこのフィルターがあります。以下に示すように、混合したり複数回使用したりできます:

Apply メソッド:

Characteristic メソッド (上記のコードに示すとおり)。

実行順序:

同じタイプのフィルターの場合、メソッドに近い実行順序が最初に実行されます。異なるタイプのフィルターの一般的な実行順序は [authorize--->action--->] です。 actionResult] と同様に、例外フィルターは例外をスローするたびに実行されます。実行順序を調整したい場合は、Order メソッド の値を調整することで実行順序を制御できます。値が小さいほど早く実行されます。次の図は、Action/Result フィルター アプリケーションの実行シーケンス図です

(1)。同じタイプのフィルター アプリケーションの例: 2 つのカスタム アクション フィルター MyFirstFilter と MyThreeFilter が同じ Action メソッド Index に適用されます。

Three コントローラー コードは次のとおりです:

MyFirstFilter コードは次のとおりです:

MyThreeFilter コードは次のとおりです:

実行結果は次のとおりです:

(2)、不同类型过滤器应用示例:有一个自定义Action过滤器MyFirstFilter,有一个自定义Result过滤器MySecondFilter,应用到同一个Action方法Index上。

Three控制器代码如下:

MyFirstFilter 代码如下:

MySecondFilter代码如下:

运行结果如下:

看完上面的解释,可能你现在对这些过滤器的执行顺序,以及如何自定义过滤器还不明白,不要紧,下面我们会逐一介绍这几个基本的过滤器的使用,以及如何自定义过滤器。

2.3、使用授权过滤器

所有实现了IAuthorizationFilter接口的都可以称之为授权过滤器:其定义如下:

 public interface IAuthorizationFilter
    {
       void OnAuthorization(AuthorizationContext filterContext);
    }
ログイン後にコピー

由于MVC框架系统自带的AuthorizeAttribute实现有一些突出的功能,而这种牵涉到安全的代码一定要谨慎的编写,所以一般我们不会直接实现这个接口,而是去继承AuthorizeAttribute这个类,并重写其AuthorizeCore方法,签名为: bool AuthorizeCore(HttpContextBase httpContext) 而处理授权失败的时候,可以重写其HandleUnauthorizedRequest方法,其签名为: void HandleUnauthorizedRequest(AuthorizationContext context) 。注意:验证与授权是两回事,验证发生在授权之前。

默认的授权过滤器已经有了验证的功能,其验证的机理是利用Asp.net平台自带的验证机制,如表单验证和Windows验证。除了验证功能,它本身还有授权的功能。授权过滤器是所有过滤器中最早运行的。

经过Route到达了控制器的时候,在调用Action之前,MVC框架会检测在相关的Action上是否有授权过滤器,如果有会调用OnAuthorization方法,如果此方法批准了请求,才会调用相应的Action。

使用授权过滤器几种情况如下:

1.直接在Action上或者控制器上加Authorize,表示启用了验证,但不牵涉到授权。

2.添加Authorize(Users=“a,b”)],表示启用了验证,并且也启用了授权,只有a或者b用户能访问此控制器。

3.当添加Authorize(Roles=“admin,Member”)]时的步骤如下:

---利用asp.net自带的角色提供者,或者实现自己的角色提供者,实现自己的角色提供者时,只需要集成RoleProvider类型,并实现其中的所有方法或部分方法,最好实现所有方法。

---在Web程序的根目录的Web.config文件中配置角色管理者。

---在适当的Action中利用Roles类型来访问自己创建的RoleProvider中的相关方法。

使用内置的授权过滤器

MVC框架内置的授权过滤器AuthorizeAttribute,它允许我们使用这个类的两个公共属性来指定授权策略,如下所示:

Users和Roles两者是并且的关系,例如Users=“a,b,c”,Roles=“admin”,表示用户是a,b,c 其中一个并且是Admin角色才能访问。

创建自定义的授权过滤器

方式一:直接实现IAuthorizationFilter接口,但不推荐这样做,因为牵涉到安全方面的代码。

方式二:继承AuthorizeAttribute这个类,并重写其AuthorizeCore方法,签名为: bool AuthorizeCore(HttpContextBase httpContext),代码如下所示:

public class MyAuthorizeAttribute : AuthorizeAttribute
  {
    private string[] allowedUsers;
    public MyAuthorizeAttribute(params string[] users)
    {
      allowedUsers = new string[] { "admin", "user1", "xf" };
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
      return httpContext.Request.IsAuthenticated &&allowedUsers.Contains(httpContext.User.Identity.Name, 
        StringComparer.InvariantCultureIgnoreCase);
    }
  }
ログイン後にコピー

2.4、使用动作过滤器

动作过滤器是可以以用于任何目的的多用途过滤器,创建自定义动作过滤器需要实现IActionFilter接口,该接口代码如下所示:

该接口定义了两个方法,MVC框架在调用动作方法之前,会调用OnActionExecting方法。在调用动作方法之后,则会调用OnActionExecuted方法。

实现OnActionExecting方法

参数ActionExecutingContext对象继承于ControllerContext,其中的2个属性:

ActionDescriptor:提供了关于Action方法的相关信息

Result:类型为ActionResult,通过给这个属性设置一个非null的值就可以取消这个请求。

我们可以用过滤器来取消一个请求,通过设置Result属性即可。代码如下所示:

public class MyActionFilterAttribute : FilterAttribute, IActionFilter
  {
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
      if(filterContext.HttpContext.Request.IsLocal)
      {
        filterContext.Result = new HttpNotFoundResult();
      }
    }
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
      //未做实现
    }
  }
ログイン後にコピー

这个例子通过用OnActionExecuting方法检查请求是否来自本地机器,如果是,编队用户返回一个“404”未找到的响应。运行结果如下图:

实现OnActionExecuted方法

我们也可以通过OnActionExecuted方法来执行一些跨越动作方法的任务,下面这个例子是计算动作方法运行的时间,代码如下:

public class MyActionFilterAttribute : FilterAttribute, IActionFilter
  {
    private Stopwatch timer;
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
      timer = Stopwatch.StartNew();
    }
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
      timer.Stop();
      if (filterContext.Exception == null)
      {
        filterContext.HttpContext.Response.Write(
          string.Format("动作方法延迟的时间: {0}",
            timer.Elapsed.TotalSeconds));
      }
    }
  }
}
ログイン後にコピー

我们将自定义的动作过滤器MyActionFilter应用到HomeController的Index方法上,运行结果如下:

2.5、使用结果过滤器

结果过滤器是多用途的过滤器,他会对动作方法所产生结果进行操作,结果过滤器实现IResultFilter接口,创建自定义结果过滤器需要现IResultFilter接口,该接口代码如下所示:

当结果过滤器运用于一个动作方法时,会在动作方法返回动作结果之前,调用OnResultExecuting方法,在返回动作结果之后,会调用OnResultExecuted方法。下面这个例子是计算动作方法返回结果运行的时间,代码如下:

public class MyResultFilterAttribute : FilterAttribute, IResultFilter
  {
    private Stopwatch timer;
    public void OnResultExecuting(ResultExecutingContext filterContext)
    {
      timer = Stopwatch.StartNew();
    }
    public void OnResultExecuted(ResultExecutedContext filterContext)
    {
      timer.Stop();
      filterContext.HttpContext.Response.Write(string.Format("结果执行延迟时间: {0}", timer.Elapsed.TotalSeconds));
    }
}
ログイン後にコピー

我们将自定义的结果过滤器MyResultFilter应用到HomeController的Index方法上,运行结果如下:

需要注意的是:动作过滤器是运行在页面输出之前,结果过滤器是运行在页面输出之后。

2.6、使用异常过滤器

异常过滤器只有在调用一个动作方法而抛出未处理的异常才会运行,这种异常来自以下位置:

A、另一种过滤器(授权、动作、或结果过滤器)。

B、动作方法本身。

C、当动作结果被执行时。

使用内置的异常过滤器

HandleErrorAttribute(处理程序错误特性),它是MVC内嵌的异常过滤器,有以下3个重要的属性:

1.ExceptionType:类型为Type,表示希望被此过滤器处理的异常类型,包括其子类型,默认值为System.Exception

2.View:类型为string,表示此过滤器呈递的视图页面,默认值为Error

3.Master:呈递的视图页的母板页,如果不指定,视图会用其默认的母版页

内嵌的HandleErrorException只有在配置文件Web.config中配置的CustomError 的mode设置为on的时候才生效(其默认模式为RemoteOnly),如下图所示:

此过滤器还会给视图传递一个HandleErrorInfo类型的对象给视图,以便视图可以显示一些额外的关于错误的信息。下面是使用异常过滤器的示例。

应用到Index动作方法上:

在Views/Shared文件夹下添加一个显示异常信息的视图页SpecialError.cshtml,页面代码如下:

@model HandleErrorInfo
  <!DOCTYPE html>
  <html>
  <head>
    <meta name="viewport" content="width=device-width" />
    <title>SpecialError</title>
  </head>
  <body>
    <p>
      <p>
        There was a<b>@Model.Exception.GetType().Name</b>
        while rendering<b>@Model.ControllerName</b>&#39;s
        <b>@Model.ActionName</b> action
      </p>
    </p>
  </body>
</html>
ログイン後にコピー

运行结果如下:

创建自定义的异常过滤器

如果我们对异常过滤器有特殊的需求,可以通过自定义的异常过滤器来完成,创建自定义异常过滤器必须实现IExceptionFilter接口,该接口代码如下:

当一个未知处理异常发生时,OnException方法会被调用。该方法的传递一个ExceptionContext对象,派生于ControllerContext类,定义了一些额外的过滤器专有属性如下表所示:

抛出的异常通过Exception属性是可以访问的。通过把ExceptionHandled属性设置为true,一个异常过滤器可以报告它已经处理了该异常,应用于一个动作的所有异常过滤器都会被调用。

需要注意的是:如果一个动作方法的所有异常过滤器均为把ExceptionHandled属性设置为true,MVC框架将使用默认的ASP.NET异常处理程序。

Result属性有异常过滤器使用,以告诉MVC框架要做什么,异常过滤器的两个主要应用是记录该异常到日志,并把适当的消息显示给用户。下面的代码将演示通过创建一个自定义的异常过滤器,当一个特定的钟类的未处理异常出现时,把该用户重定向到一个指定的错误页面。

public class MyExectionAttribute:FilterAttribute,IExceptionFilter
  {
    public void OnException(ExceptionContext filterContext)
    {
      if(!filterContext.ExceptionHandled&&
        filterContext.Exception is NullReferenceException)
      {
        filterContext.Result = new RedirectResult("~/Content/SpecialErrorPage.html");
        filterContext.ExceptionHandled = true;
      }
    }
}
ログイン後にコピー

然后在项目根目录添加一个名为Content的文件夹,在该文件夹下创建SpeciErrorPage.html文件,当异常被处理时,将以这个错误页面显示个用户。该页面代码如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
</head>
<body>
  <h1>Sorry</h1>
  <p>this is a Excetption test</p>
  There was aNullReferenceException while renderingHome&#39;s Index action 
</body>
</html>
ログイン後にコピー

在控制器中应用MyExection异常过滤器,并主动让其抛出一个空引用异常,以便测试。

public class HomeController : Controller
  {
    [MyExection]
    public ActionResult Index()
    {
      throw new NullReferenceException();
    }
  }
ログイン後にコピー

运行结果如下:

 

总结:本文章简单总结了对过滤器的理解以及如何使用MVC框架内置基本的过滤器和如何自定义过滤器及应用。


以上がAsp.Net MVCのフィルターの詳しい説明 学習まとめ(画像とテキストで詳しく解説)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP MVC アーキテクチャ: 将来に向けた Web アプリケーションの構築 PHP MVC アーキテクチャ: 将来に向けた Web アプリケーションの構築 Mar 03, 2024 am 09:01 AM

はじめに 今日の急速に進化するデジタル世界では、堅牢かつ柔軟で保守可能な WEB アプリケーションを構築することが重要です。 PHPmvc アーキテクチャは、この目標を達成するための理想的なソリューションを提供します。 MVC (Model-View-Controller) は、アプリケーションのさまざまな側面を独立したコンポーネントに分離する、広く使用されている設計パターンです。 MVC アーキテクチャの基礎 MVC アーキテクチャの核となる原則は、関心事の分離です。 モデル: アプリケーションのデータとビジネス ロジックをカプセル化します。ビュー: データの表示とユーザー インタラクションの処理を担当します。コントローラー: モデルとビュー間の対話を調整し、ユーザーのリクエストとビジネス ロジックを管理します。 PHPMVC アーキテクチャ phpMVC アーキテクチャは従来の MVC パターンに従いますが、言語固有の機能も導入しています。以下はPHPMVCです

PHP MVC アーキテクチャの上級ガイド: 高度な機能のロックを解除する PHP MVC アーキテクチャの上級ガイド: 高度な機能のロックを解除する Mar 03, 2024 am 09:23 AM

MVC アーキテクチャ (モデル-ビュー-コントローラー) は、コードを編成し、WEB アプリケーションの開発を簡素化するための明確な構造を提供するため、PHP 開発で最も一般的なパターンの 1 つです。基本的な MVC 原則はほとんどの Web アプリケーションには十分ですが、複雑なデータを処理したり高度な機能を実装する必要があるアプリケーションにはいくつかの制限があります。モデル層の分離 モデル層の分離は、高度な MVC アーキテクチャでは一般的な手法です。これには、モデル クラスを小さなサブクラスに分割し、それぞれが特定の機能に焦点を当てることが含まれます。たとえば、電子商取引アプリケーションの場合、メイン モデル クラスを注文モデル、製品モデル、顧客モデルに分割できます。この分離により、コードの保守性と再利用性が向上します。依存関係注入を使用する

Vue3 のフィルター関数: データをエレガントに処理する Vue3 のフィルター関数: データをエレガントに処理する Jun 18, 2023 pm 02:46 PM

Vue3 のフィルター関数: データをエレガントに処理する Vue は、大規模なコミュニティと強力なプラグイン システムを備えた人気のある JavaScript フレームワークです。 Vue のフィルター関数は、テンプレート内のデータを処理して書式設定できる非常に実用的なツールです。 Vue3 のフィルター関数にはいくつかの変更が加えられています。この記事では、Vue3 のフィルター関数を詳しく説明し、それらを使用してデータを適切に処理する方法を学びます。フィルター機能とは何ですか? Vue のフィルター関数は次のとおりです。

プラグインを使用して Vue でカスタム フィルターを実装するためのヒント プラグインを使用して Vue でカスタム フィルターを実装するためのヒント Jun 25, 2023 pm 05:01 PM

プラグインを使用して Vue でカスタム フィルターを実装するためのヒント Vue.js には、ビュー データのフィルター処理の必要性に対処する便利な方法、つまりフィルター (Filter) が提供されます。フィルターは主に、ビュー内のデータの書式設定と処理を担当して、データをより直感的で理解しやすくします。 Vue には、日付書式設定、通貨書式設定などの一般的に使用されるフィルターがいくつか組み込まれており、カスタム フィルターもサポートしています。この記事では、Vue プラグインを使用してカスタム フィルターを実装する方法を紹介し、いくつかの実用的なフィルター手法を提供します。

Vue テクノロジー開発でデータをフィルターおよび並べ替える方法 Vue テクノロジー開発でデータをフィルターおよび並べ替える方法 Oct 09, 2023 pm 01:25 PM

Vue テクノロジ開発でデータをフィルタリングおよび並べ替える方法 Vue テクノロジ開発では、データのフィルタリングと並べ替えは非常に一般的で重要な機能です。データのフィルタリングと並べ替えを通じて、必要な情報を迅速にクエリして表示できるため、ユーザー エクスペリエンスが向上します。この記事では、Vue でデータをフィルターおよび並べ替える方法を紹介し、読者がこれらの関数をよりよく理解して使用できるように具体的なコード例を示します。 1. データのフィルタリング データのフィルタリングとは、特定の条件に基づいて要件を満たすデータをフィルタリングすることを指します。 Vue では、comp を渡すことができます

Vue エラー: フィルター内のフィルターが正しく使用できません。解決するにはどうすればよいですか? Vue エラー: フィルター内のフィルターが正しく使用できません。解決するにはどうすればよいですか? Aug 26, 2023 pm 01:10 PM

Vue エラー: フィルター内のフィルターが正しく使用できません。解決するにはどうすればよいですか?はじめに: Vue では、フィルターはデータの書式設定やフィルター処理に使用できる一般的に使用される関数です。ただし、使用中にフィルターを正しく使用できないという問題が発生する場合があります。この記事では、いくつかの一般的な原因と解決策について説明します。 1. 原因分析: フィルターが正しく登録されていません: Vue のフィルターは、テンプレートで使用する前に登録する必要があります。フィルタが正常に登録されなかった場合は、

PHP 電子メール フィルター: スパムをフィルターして識別します。 PHP 電子メール フィルター: スパムをフィルターして識別します。 Sep 19, 2023 pm 12:51 PM

PHP 電子メール フィルター: スパムをフィルターして識別します。電子メールの普及に伴い、スパムの量も増え続けています。ユーザーにとって、受信するスパムの量は情報過多や時間の無駄につながる可能性があります。したがって、スパムメールをフィルタリングして識別する効率的な方法が必要です。この記事では、PHP を使用してシンプルだが効果的な電子メール フィルターを作成する方法と、具体的なコード例を示します。電子メール フィルタの基本原則 電子メール フィルタの基本原則は、電子メールが

Tomcat の文字化けしたコードを解決するいくつかの方法 Tomcat の文字化けしたコードを解決するいくつかの方法 Dec 28, 2023 pm 01:32 PM

Tomcat での中国語の文字化けの問題を解決するためのいくつかの方法 (具体的なコード例が必要) Web 開発では、Tomcat での中国語の文字化けの問題によく遭遇します。この問題により、漢字を処理するときに文字化けが発生したり、ボックス、疑問符、その他の文字が表示されたりして、ユーザーに不快な体験をもたらします。この問題を解決するために、この記事では一般的に使用されるいくつかの方法を紹介し、具体的なコード例を示します。 Tomcat 設定ファイルを変更します。Tomcat インストール ディレクトリで conf/server.xml ファイルを見つけ、デフォルトのファイルを検索します。

See all articles