2

コントローラー ハンドラー ファクトリでインスタンス化せずに、カスタム アクション インボーカーを使用することは可能ですか? たとえば、カスタム コントローラー ファクトリでは次のようになります。

IController IControllerFactory.CreateController(RequestContext reqContext, string controllerName)
{
    var controller = base.CreateCOntroller(reqContext,controllerName ) as Controller;
    controller.ActionInvoker = new CustomActionInvoker();
}

または、カスタム アクション インボーカーを使用せずに MVC アクションを実行できる別の方法はありますか?

質問の更新

コントローラー、発言HomeControllerIndexアクションがあります。Indexコントローラのメイン アクションです。Indexアクションが実行されると、MVC ビューは Ajax - GET リクエスト (jTemplates を使用) を使用して複数のアクションを起動ます。

// Controller actions

// main action and View
public ActionResult Index() { ... }

public ActionResult AjaxAction1(string id) { ... }
public ActionResult AjaxAction2() { ... }
public ActionResult AjaxAction3() { ... }

ここで、特定のシナリオに応じて、これらのアクションの一部を実行しないようにフィルター処理したいと考えています。たとえば、が 2 に等しいAjaxAction1ときに実行を停止したいとします。id

元の質問に戻ります。アクションインボーカーを使用せずにこれを達成する方法はありますか? アクションインボーカーを使用したくない理由は、私のプロジェクトが構造化されて循環参照になってしまった方法です。

どんなアイデアでも大歓迎です。

4

2 に答える 2

1

Controller をサブクラス化し、そこに ControllerActionInvoker を作成できる答えが見つかりました。

于 2010-08-08T12:05:49.613 に答える
0

アクション メソッド セレクターの使用

が 2 のときに何が起こるかによって異なりますidが、これはカスタム アクション メソッド セレクターを作成することで非常に簡単に実行できます。

アクション メソッド セレクターを使用すると、パラメーター値に応じて実行されるアクションを指定できます。

[RequiresParameterValue("id", @"^2$")]
[ActionName("AjaxAction")]
public ActionResult AjaxAction1(string id) { ... }

[RequiresParameterValue("id", @"^[^2]*$")]
[ActionName("AjaxAction")]
public ActionResult AjaxAction2(string id) { ... }

この例からわかるように、カスタム アクション メソッド セレクターは 2 つのパラメーターを取ります。

  • コントローラーアクションパラメーター名 (id例)
  • コントローラーアクションパラメーター値をチェックする正規表現

アクション メソッド セレクターは、すべてのルート値がクライアントから送信されたときに文字列として認識されるため、正規表現を使用して実際にこれを引き出すことができます。また、非常に柔軟になります。

最初のアクション メソッドは のときに実行されid == "2"、2 番目のアクション メソッドは のときに実行されid != "2"ます。

于 2011-02-28T13:41:02.757 に答える