13

mcv3 について読んでいるときに、 という属性名に出会いました[ActionName]。実際には、アクション メソッドに新しい名前を付けます。私は考えさせられるシナリオをテストしました。内部はどのように機能していますか。コントローラー クラスに次の 2 つのアクション メソッドがある場合

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

これはある種の無限ループに陥るか、あいまいな例外が発生するだろうと思いました。しかし、同じことがうまく機能し、このURLを指定すると2番目のメソッドが呼び出されますhttp://mysite:1234/mycontroller

MVC エンジンが最初の方法ではなく 2 番目の方法を選択した理由は何ですか?

なぜこれが起こるのか分かりますか?

4

3 に答える 3

18

Phil Haack がこの問題について投稿しています:メソッドがアクションになる方法

つまり、ControllerActionInvoker はリフレクションを使用して、アクション名と一致するメソッドを見つけます。

ActionNameAttribute は、メソッドの名前を再定義します。

また、View の名前は MethodName ではなく ActionName と一致することに注意してください。メソッド Index は、「Test」という名前のビューを検索します。

于 2012-04-11T06:58:03.517 に答える
8

これがルーティング エンジンの魔法です。global.asax.cs ファイル内のどこかにルーティング パターンが定義されています。

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

これは、アプリケーション用に定義されたルーティング パターンです。アクション名属性は、パラメーター コレクション内の「アクション」パラメーターにマップされます (MapRoute の 3 番目のパラメーター)。

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

于 2012-04-11T06:32:54.120 に答える
1

ActionNameAttribute アクションの名前に使用される属性を表します。存在しない場合は、メソッドの名前が使用されます。

于 2013-06-03T12:14:45.160 に答える