2012-04-11 19 views
11

mcv3について読むと、私は[ActionName]という属性名を見つけました。実際には、アクションメソッドに新しい名前が付けられます。私は考えるシナリオをテストしました。内部はどのように機能していますか?私は私のコントローラクラスMVC3 ActionName属性、その動作と効果

[ActionName("Test")] 
public ActionResult Index() 
{ 
     return View(); 
} 
[ActionName("Index")] 
public ActionResult Test() 
{ 
     return View(); 
} 

で次の二つのアクションメソッドを持っているとき、私は、これは無限ループのいくつかの種類になってしまいますか、いくつかの曖昧例外を与えるだろうと思いました。しかし、同じことがうまく動作し、私はこのURLを与えるときに2番目のメソッドが呼び出されますhttp://mysite:1234/mycontroller

MVCエンジンは2番目の方法を選択し、最初のものではないのですか?

これはどうして起こりますか?

答えて

17

フィル・ハークは、この問題に関する記事があります:How a method becomes an action要するに

:ControllerActionInvokerは、アクション名と一致する方法を見つけるためにリフレクションを使用します。

ActionNameAttributeは、メソッドの名前を再定義します。名前「テスト」

+0

ok、優秀な投稿。私が得た記事から、魔術師はControllerActionInvokerです。これはルートデータ辞書からデータ(キー "アクション"から)を読み込みます。これは文字列値を取得します。次に、ActionNameが最初に検索され、次にメソッド名が検索されます。 – thinkmmk

+0

@thinkmmkメソッドを探しません。 'action'を探します。 ActionNameAttributeを使用しない場合は、次のようになります。method = action –

+0

@AndrewF自分のメソッドに対してActionName属性がない場合、ControllerActionInvokerは、コントローラークラスのリフレクションを通じてメソッド名を検索します。またはmvcが存在しない場合、アクション名属性をそれ自身で置きますか? – thinkmmk

8

これはRouting engineの魔法です。どこかglobal.asax.csファイル内のこれはあなたのアプリケーションのために定義されたルーティングパターンである

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

のほとんどがそのデフォルト値、定義されたパターンがルーティングされるだろう。アクション名属性は、パラメータコレクション内の 'action'パラメータ(MapRouteの3番目のパラメータ)にマッピングされます。

「インデックス」のアクションを「テスト」メソッドにマップする場合は、 Test()メソッドを呼び出す必要があります。私はそれがまだあなたのためにIndex()を呼び出すかどうか分からない。実際に、パブリックメソッドに対してActionName属性が見つかると、ルーティングエンジンはメソッド名を気にしません。

+0

こんにちはChandermani、 ありがとうございます。私は上記の行がglobal.asaxファイルにあります。私は質問を編集しました。はい、Test()メソッドを呼び出します。 あなたの説明からわかるように、これはRouting Engineの魔法です。重複する名前が見つかると、実際のメソッド名ではなくActionName属性を優先します。もう1つ、ライフサイクルのルーティングフェーズまたはコントロールアクションフェーズのどこでこのデカッションが行われますか? – thinkmmk

+0

ルートnew {controller = "Home"、action = "Index"、id = ""}を見てください。ルーティングエンジンは、コントローラ、アクション(したがってコントローラ上のメソッド)を決定し、コントローラメソッドに制御が渡されます。 – Chandermani

1

ActionNameAttributeとインデックスは、ビューを検索する方法は、それが名前に使用される属性を表します

また、あなたのビューの名前がACTIONNAME、ないメソッド名と一致していることに注意してください行動の存在しない場合は、メソッドの名前が使用されます。

関連する問題