1. ホーム
  2. asp.net

[解決済み] Webフォームの中に部分ビューを入れる方法

2023-06-06 11:42:34

質問

私がプログラミングしているあるサイトでは、ASP.NET MVCとWebFormsの両方を使用しています。

私は部分的なビューを持っており、これをWebフォーム内に含めたいと思っています。部分ビューにはサーバーで処理されるコードがあるため、Response.WriteFile を使用してもうまくいきません。 javascriptを無効にして動作させる必要があります。

どうすればよいのでしょうか?

どのように解決するのですか?

これを行う方法を理解できるかどうかを確認するために、MVC ソースを調べました。コントローラ コンテキスト、ビュー、ビュー データ、ルーティング データ、および html レンダー メソッドの間には非常に密接な結合があるように思われます。

基本的に、これを実現するためには、これらの余分な要素をすべて作成する必要があります。たとえば、ルーティング データは現在の WebForms ページを無視するように考慮します。

大きな問題は HttpContext にあるようです。MVC ページは HttpContextBase に依存し (WebForms のように HttpContext ではなく)、どちらも IServiceProvider を実装しますが、それらは関連性がありません。MVC の設計者は、新しいコンテキスト ベースを使用するようにレガシー WebForms を変更しないことを意図的に決定しましたが、ラッパーを提供しました。

これは動作し、WebForm に部分的なビューを追加することができます。

public class WebFormController : Controller { }

public static class WebFormMVCUtil
{

    public static void RenderPartial( string partialName, object model )
    {
        //get a wrapper for the legacy WebForm context
        var httpCtx = new HttpContextWrapper( System.Web.HttpContext.Current );

        //create a mock route that points to the empty controller
        var rt = new RouteData();
        rt.Values.Add( "controller", "WebFormController" );

        //create a controller context for the route and http context
        var ctx = new ControllerContext( 
            new RequestContext( httpCtx, rt ), new WebFormController() );

        //find the partial view using the viewengine
        var view = ViewEngines.Engines.FindPartialView( ctx, partialName ).View;

        //create a view context and assign the model
        var vctx = new ViewContext( ctx, view, 
            new ViewDataDictionary { Model = model }, 
            new TempDataDictionary() );

        //render the partial view
        view.Render( vctx, System.Web.HttpContext.Current.Response.Output );
    }

}

そして、WebFormでは次のようにします。

<% WebFormMVCUtil.RenderPartial( "ViewName", this.GetModel() ); %>