2

大規模なASP.NETWebフォームサイトである「レガシーシステム」を使用しています。このシステムの主な拡張ポイントは、動的にロードおよびレンダリングされる.ascxコントロールを作成することです。

WebサイトプロジェクトにはASP.NETMVC3の依存関係が参照されており、ASP.NET 4ルーティングシステムに次のルートを導入することで、MVCを使用するための根拠もあります。

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

このルートによれば、のurlパターンによって呼び出されるすべてのものが{controller}.mvcMVCパラダイムに従ってレンダリングされます。

私のascxコントロール(ASCXの使用を避けることはできません、私はそれと一緒に暮らす必要があります)で、コードからコントローラーを呼び出しています:

<% 
    var controller = new NamingsController(DependencyResolver.Current.GetService<InDocContext>());
    var htmlToRender = controller.RenderExistingNamings(); 
%>

   <%=htmlToRender%>

コントローラを呼び出すこの方法は間違っています-私は手動で作成していますが、「通常の方法」ではコントローラファクトリによって作成されています。私の場合、リクエストコンテキスト、つまりコントローラーコンテキストは設定されておらず、コントローラーは標準のロジッククラスよりも優れています。

私の場合、コントローラーのアクションを呼び出して、ユーザーがブラウザーを介してコントローラーを呼び出したかのように実行する正しい方法は何ですか?

4

2 に答える 2

1

次のことを試してください。

<%
    var routeData = new RouteData();
    routeData.Values["controller"] = "Namings";
    routeData.Values["action"] = "RenderExistingNamings";        
    IController controller = new NamingsController(DependencyResolver.Current.GetService<InDocContext>());
    var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
    controller.Execute(rc);        
%>

がないことに注意してください<%=htmlToRender%>。出力はすぐに応答に書き込まれます。

WebFormによって設定されたコンテンツタイプではなく、コントローラーアクションによって設定されたコンテンツタイプになるContent-Type応答ヘッダーに注意する必要があります。両方の場合、text/htmlそれは問題になるはずです。

于 2012-07-15T07:40:10.420 に答える
0

Html.RenderAction()代わりに使ってみましたか?

http://msdn.microsoft.com/en-us/library/system.web.mvc.html.childactionextensions.renderaction.aspx

于 2012-07-14T23:51:46.397 に答える