3

現在実行中のコントローラーにアクセスして、適切な ActionResult の戻りをヘルパー メソッドにオフロードできるようにしたいと考えています。この目的のために、私は ControllerContext.Current であると思っていたものと同等のものを探していますが、そうではありません。ありがとう!

明確にするために編集: JavaScript ベースの一般的なフォーム コントロールがありますが、noscript で動作するようにオプションを追加したいと思います。現時点で、コントローラーは ViewData.Model を JSON 化された Models.FormResponse<T> に設定します。

この FormReponse は、投稿のステータスと生成されたエラー メッセージで設定されているため、スクリプト/ノースクリプト チェック (非表示のフォーム入力) を実行する GetActionResult() メソッドと、次のいずれかが必要です。

  1. Model を JSONed FormResponse に設定し、View() を返す、または
  2. FormResponse をセッションにシリアル化し、Redirect() を返します。

これは明らかに戻り値を変更し、毎回自分でチェックしたくないので、これを次のように呼び出すには、FormResponse の GetActionResult メソッドから View または Redirect を呼び出す必要があります。

return formResponse.GetActionResult();

より宇宙的な設計では、これがさらに堅牢になる可能性があることはわかっていますが、現時点ではnoscriptオプションは主要な機能ではないため、他のものを壊さない迅速な解決策が必要です.

アップデート #2

ActionResult クラスに実装された以下は、私のために仕事をします。ありがとうCVertex!

public override void ExecuteResult(ControllerContext context)
    {
        if (CMSEnvironment.NoScript)
        {
            Oracle.Response.Redirect(Oracle.Request.UrlReferrer.ToString(), true);
        }

        context.Controller.ViewData.Model = _model.ToJSON();

        new ViewResult()
        {
            ViewName = Areas.Site.Helpers.SharedView.Service,
            ViewData = context.Controller.ViewData
        }.ExecuteResult(context);
    }
4

2 に答える 2

4

静的はテスト容易性に悪影響を及ぼし、MVC では非常に推奨されません。

現在のコントローラーとアクション メソッドにアクセスする必要があるのはなぜですか?

これを行う最善の方法は、独自の ActionFilter を実装することです。これにより、アクション メソッドの実行前または実行後にリクエストをインターセプトする手段が得られます。

編集: フィルターの OnActionExecuted 内の結果をインターセプトすることにより、noscript/script チェックを実行し、それに応じて ViewData を変更してビューで使用することができます。OnActionExecuted 内では、noscript チェックを実行して、最終的な ActionResult または ViewData を自由に完全に制御することもできます。

または、これらすべての決定を行う独自の ActionResult を作成することもできます。したがって、コントローラーアクションは最終的に

return new MyActionResult(format_and_view_agnostic_model_object);
于 2009-03-01T12:50:06.947 に答える
1

スレッドから現在の Controller に移動する方法はないようです。つまり、ControllerBuilder を取得でき、MvcHttpHandler を取得できますが、ハンドラーが使用しているコントローラー インスタンスにアクセスすることはできません。

于 2009-03-01T13:09:07.697 に答える