ASP.NET MVC学習のコントローラー編拡張性

12843 ワード

原文:
ASP.NET MVC学習のコントローラー編拡張性
一、前言
以前のエッセイではコントローラについて述べていましたが、今日のエッセイはこれまでの拡張として使われています.
 
二、本文
1.カスタム動作方法
メソッドの名前とパラメータは同じですが、論理は異なります.対応する注釈属性を設定することで、どのアクションメソッドを呼び出すかを決定することができます.アクションの名前とメソッドの名前を区別する必要がある場合は、ActionName注記プロパティを使用します.たとえば、ローカル・アクセスと非ローカル・アクセスで異なるページを表示するようにページを要求しますが、異なる方法で区別して書きたい場合は、次のコードのような注釈属性を使用できます.
 1 [ActionName("Index")]

 2 public ActionResult LocalIndex()

 3 {

 4     return View();

 5 }

 6 

 7 public ActionResult Index()

 8 {

 9     return View();

10 }

 
最初のメソッドの名前はLocalIndexと呼ばれていますが、最終ページの名前はActionNameで設定した名前で検索されるので、読者はメソッドの名前でビューを新規作成しないでください.これは間違っています.
 
2.非動作方法
最初から今まで、コントローラに書かれた公開方法が最後に1つの動作方法(簡単に言えば1つのページに対応する)であることに気づいたに違いないが、公開方法が必要になることがあるが、それは動作方法ではなく、ユニットテストを容易にするためだけに、私たちはどうすればいいのだろうか.ASP.NET MVCも同様にこれらを考え,NonAction注釈属性を提供してくれたが,使用が簡単であるため単独で例を挙げない.
 
3.カスタム動作方法セレクタ
上記の第1節では,動作方法が同じ名前であってもパラメータが完全に同じであってもよいことを紹介したが,コントローラはどの動作方法を実行するかをどのように判断するのか.1つは、動作方法選択器(動作方法の注釈属性)の戻り値に基づいて一致する動作方法、ASPをフィルタリングすることである.NET MVCにはHttpPostなどがありますが、もちろん、以下の抽象クラスのIsValidForRequestメソッドを実装すればカスタマイズできます.
 1     [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]

 2     public abstract class ActionMethodSelectorAttribute : Attribute

 3     {

 4         protected ActionMethodSelectorAttribute();

 5 

 6         public abstract bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo);

 7 }

 8 

 9   MethodInfo              。

10 

11           ,    form               :

12     public class LoginAttribute : ActionMethodSelectorAttribute

13     {

14         bool _isFirst;

15 

16         public LoginAttribute(bool isFirst)

17         {

18             _isFirst = isFirst;

19         }

20 

21         public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)

22         {

23 

24             string obj = controllerContext.HttpContext.Request.Form["loginType"];

25             if (obj != null)

26             {

27                 if (_isFirst)

28                 {

29                     if (obj.Equals("true"))

30                         return true;

31                 }

32                 else

33                 {

34                     if (obj.Equals("false"))

35                         return true;

36                 }

37             }

38             return false;

39         }

40     }

 
4.非同期コントローラ
ASPに従事すると信じています.NETの人はきっと非同期という概念を知っています.この概念はASPだけではありません.NETでもASP.NET MVCにも同様に存在しますが、少し変化があります.このコントローラに非同期のメソッドが含まれている場合は、AsyncControllerクラスを継承する必要があります.また、非同期のアクションメソッドを2つの部分に分ける必要があります.最初に非同期のアクションを実行するメソッドは、アクションメソッド名+Asyncと命名する必要があります.非同期のアクション実行が完了すると、アクションメソッド名+Completedメソッドが呼び出されます.特に、メソッドの仕様に注意してください.名前が間違っていると、非同期コントローラの正しい実行結果が表示されない可能性があります.簡単な例があります.
 
 1 namespace MvcStudy.Controllers

 2 

 3 {

 4 

 5     [SessionState(System.Web.SessionState.SessionStateBehavior.Disabled)]

 6 

 7     public class TestController : AsyncController

 8 

 9     {

10 

11         [NoAsyncTimeout]

12 

13         public void IndexAsync()

14 

15         {

16 

17             AsyncManager.OutstandingOperations.Increment();

18 

19             Task.Factory.StartNew(() =>

20 

21             {

22 

23                 Thread.Sleep(2000);

24 

25                 AsyncManager.Parameters["data"] = "test";

26 

27                 AsyncManager.OutstandingOperations.Decrement();

28 

29             });

30 

31         }

32 

33  

34 

35         public ActionResult IndexCompleted(string data)

36 

37         {

38 

39             ViewBag.Data = data;

40 

41             return View();

42 

43         }

44 

45     }

46 

47 }

 
 
ここではIncrementメソッドを使用して、いくつかの非同期操作を開くことを示す数値を渡す非同期操作を開始し、StartNewを使用して非同期操作を開始し、非同期操作が完了した後にParametersにデータを入れることで、IndexCompletedのパラメータで取得でき、非同期操作が最後にDecrementメソッドを呼び出して非同期操作が完了したことを識別します.IndexAsyncの動作方法には、タイムアウト制限がないことを示す注記属性(NoAsyncTimeout)も存在します.タイムアウトを設定する必要がある場合は、AsyncTimeoutを使用してミリ秒単位の時間を入力し、非同期操作の実行がタイムアウトした場合は、TimeOutExceptionタイプの例外が発生します.
 
読者はSessionStateという注釈属性が何をしているのか疑問に思うに違いない.ASPに詳しいに違いない.NETの一般的なプロセッサは、デフォルトではセッションにアクセスできません.その目的はパフォーマンスの向上です.ASP.NET MVCでは、SessionStateを使用してコントローラのメンテナンスを不要にすることができます.もちろん、このコントローラでSessionにアクセスすることはできませんが、パフォーマンスの向上を得ることができます.