通常のWebフォームからMVCアクション結果を使用する方法(ControllerContextを偽装)?

StackOverflow https://stackoverflow.com/questions/1613088

質問

ブラウザにレンダリングする ActionResult オブジェクトを返すプラグ可能なフレームワークがあります。最新の要件の1つは、プラグインが通常のASP.NET Webフォームアプリケーションから呼び出し可能であることです。

これまでのところ、これは非常に基本的なActionResultsで機能します:

public class ActionResultTranslator {

    HttpContextBase _context;

    public ActionResultTranslator(HttpContextBase context ) {

        _context = context;
    }

    public void Execute(ActionResult actionResult) {

        ControllerContext fakeContext = new ControllerContext();
        fakeContext.HttpContext = _context;            

        actionResult.ExecuteResult(fakeContext);        
    }
}

上記をWebフォームから次のように呼び出します:

protected void Page_Load(object sender, EventArgs e) {
   HttpContextWrapper contextWrapper = new HttpContextWrapper(this.Context);
   var translator = new ActionResultTranslator(contextWrapper);
   translator.Execute(new RedirectResult("http://google.com"));     
}

すべてを接続するには、他に何をする必要がありますか?たとえば、ViewResultを返したい場合はどうなりますか?

役に立ちましたか?

解決

ControllerContextで偽造するプロパティが多すぎません。

  • HttpContext -これでカバーされました
  • コントローラー-私が知る限り、これがnullのままである場合、標準のActionResultsは気にしません
  • RequestContext -nullのままにすると自動的に入力されます
  • RouteData -nullのままにすると、空のコレクションが入力されます。

したがって、ActionResultがRouteDataに存在する任意のキーに依存することを心配するだけです。 ViewResultは、 action および controller を設定する限り、ビューファイルを探す場所を認識できるようにする必要があります。これらの値を持つRouteDataを提供するようにコードを変更する場合は、大丈夫です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top