0

コントローラーのメソッドを直接呼び出す場合、ActionFilterAttribute を呼び出すにはどうすればよいでしょうか? 次のことを想像してください。

public class ApiController : Controller {

    public ActionResult CallSomething() {
         return IsCalled();
    }

    [MyAction]
    public ActionResult IsCalled() {
         return View();
    }
}

そのため、リクエストが に入る/Api/CallSomethingと、CallSomething() メソッドは別のメソッド (この場合は IsCalled()) を内部的に呼び出しますが、そのメソッドが呼び出されると、ActionFilterAttribute が呼び出されて実行されます。

現時点では、ActionFilterAttribute は元のリクエストの一部である場合にのみ呼び出されます。これは、MVC ライフサイクル全体の一部であり、メソッドを直接呼び出すだけなので、RedirectToAction を実行する必要があるためです。 MVCによって起動させたい場合。RedirectToAction は URL を変更するため、これは私の目的には適していません。

System.Web.Mvc コードについて調べましたが、どのように、またはいつ呼び出されるのかわかりません。それができれば、リフレクションを使用できる可能性があると思います。このイベントでは、ExecuteResult() をオーバーライドして独自のコンテンツを http 応答に書き込むため、ビューは関係ありません。

とにかく、これはおそらく不可能だと諦めましたが、試してみる価値があると思いました.

4

2 に答える 2

1

それを達成するための実際的に正しい方法はありません。だからそれをしようとしないでください。コントローラーアクションは、例のように自分自身を呼び出すべきではありません。この場合、リダイレクトを使用します。または、リダイレクトが必要ない場合は、クライアントに2番目のアクションに直接リクエストを送信してもらいます。

ああ、再利用したいコントローラーアクション間に共通の機能がある場合は、この機能を他のレイヤーに外部化するだけです。正確なシナリオに応じて、ASP.NETMVC3で共通の機能を提供する方法はたくさんあります。

于 2012-06-21T13:31:50.837 に答える
0

あなたが話していることを行う最も簡単な方法は、フィルターおよびアドホックとして実行したい機能を除外することです。実行すべきではない場所でフィルターを強制的に実行することは意味がありません。しかし、フィルターの一部をアドホックに呼び出したいと思うのは理にかなっているかもしれません。これを行う最も簡単な方法は、単純な古い静的メソッドを使用することです。

public class ApiController : Controller {

    public ActionResult CallSomething() {
         MyActionFilter.CommonStaticMethodThatIsAlsoUsedInTheNormalFilter();
         return IsCalled();
    }

    [MyActionFilter]
    public ActionResult IsCalled() {
         return View();
    }
}

達成しようとしていることをより具体的にする必要があります。フレームワークには、より適した他の機能があるかもしれません。

于 2012-06-21T13:58:28.390 に答える