web-dev-qa-db-ja.com

ASP.Net MVCとWebFormsを組み合わせる

MVCルートアプリケーション(マスターページとテーマを含むポータル)を作成し、WebFormsベースのサブプロジェクトをいくつか追加することは可能ですか(ポータルに統合したい既存のWebFormsアプリケーションが既にあります)。

ナビゲーション(サイトマップ、URLルーティング)をどのように集中化しますか?
マスターページをどのように共有しますか?
リソースをどのように参照しますか(〜問題など)。

43
Zyphrax

WebフォームとMVCの組み合わせは完全に可能です。 Scott Hanselmanによるこのブログ投稿 を参照してください。

42
jeroenh

参考までに、昨日このタスクを達成することができました。つまり、既存のWebForms WebサイトにMVC機能を追加します。

「最良の方法は、WebフォームアプリケーションをMVCとして書き直すことです」と言われますが、アプリケーションが十分に確立されており、時間が経つにつれて非常に怪物になった場合、ビジネスケースはほとんどありません)。私の場合、このアプリケーションに新しい機能を実装するように頼まれました-そして、最近他のプロジェクトでMVCで開発していた-私はこの新しい機能をMVCで構築したかったのです。これは私がやったことです:

  1. 新しいASP.NET MVC 4アプリケーションを作成し、空のテンプレート(Razorを使用)を選択しました

  2. ロードしたら、右クリックしてReferences> Browseを選択し、既存のWebサイトのBinフォルダーに移動します。次に、既存のサイトで使用していたDLLに追加しました。参考のために、私はAjaxControlToolkitを使用しているため、NuGetから最新のものを追加することにしました。これにより、web.configファイルが自動更新されます

  3. 次に、Windows Explorerを開いて、既存のWebサイトのルートフォルダーに移動しました。 Visual Studioを使用して、既存のサイトのトップレベルフォルダー構造を複製し(Binフォルダーを除く)、同じトップレベルフォルダーを持つ2つのサイト(ただし、MVCを持つ新しいプロジェクト) App_Start、Controllers、Models、Viewsフォルダもありますが、明らかにBinではありません)。

  4. セットアップしたら、Windows Explorerの対応する最上位フォルダーからサブフォルダーとファイルをコピーし、ソリューションに貼り付けました。このようにすると、プロジェクトはサブフォルダーとコンテンツを直接コピーし、Visual Studioを介して既存のアイテムをファイルにコピーするだけでコピーできるため、時間を節約できます。注:ルートフォルダーについては、[〜#〜] not [〜#〜] copy in web.configまたはGlobal.asax =、ただし他のすべてのファイル(default.aspxなど)にコピー

  5. すべてのコンテンツがコピーされたら、新しいプロジェクトでweb.configを開き、既存のサイトでweb.configを開きました。既存のWebサイトに固有のもの(appSettings、connectionStrings、名前空間、メンバーシップ情報など)を新しいweb.configにコピーしました。 Global.asaxファイルにも同じことが当てはまります。

  6. ビルドを試みて、見落としていたものはすべて修正しました。

  7. すべてが正しくなったら(そして、死の黄色い画面をいくつか撃ち落としていた)、default.aspxをロードするときにページが見つからないというエラーが表示されることに気付きました。これはルーティングにかかっています。ルーティング情報に加えた変更は次のとおりです(Global.ascx MVC 3またはApp_Start> RouteConfig.cs MVC 4にあります)。

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        // This informs MVC Routing Engine to send any requests for .aspx page to the WebForms engine
        routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
        routes.IgnoreRoute("{resource}.aspx");
    
        // Important change here: removed 'controller = "Home"' from defaults. This is the key for loading
        // root default page. With default setting removed '/' is NOT matched, so default.aspx will load instead
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { action = "Index", id = UrlParameter.Optional }
        );
    }
    

これらのすべての手順を実行すると、サイトは以前と同じように読み込まれて実行されましたが、現在はASP.NET WebFormsとMVCハイブリッドがあります。このタスクを達成する簡単な方法はおそらくあると思いますが、他の方法を試しましたが失敗しました。この方法で約20分かかり、稼働していました...よく座ってコーディングしました:)

24
Matt

上記の素晴らしい答え。他に考えられることは、ASP.NETからASP.NET MVCへの移行です。その場合、 この投稿が役立つかもしれません プロジェクトファイルを移行します。

5
Odd

私はこの状況であまりにも立ち往生していました、私はすべて解決したソリューションを得た後、まずあなたのビューフォルダに_web.config_をコピーしました。

Route.config(Routeconfig)ファイルを開くと、1つのメソッドRegisterRoutesが見つかり、そのまま保持し、RegisterRoutes2()という名前の別のメソッドを作成し、以下のメソッドコードをコピーして貼り付けます。 mvcアプリケーションから:

_public static void RegisterRoutes2(RouteCollection routes)
{...}
_

場合によっては、mvcアプリのメソッド名はRegisterRoutesになります。上記のコードが機能しない場合は、マシンのmvcアプリケーションからコピーして貼り付けてください。次に、_global.asax_ファイルに移動すると、RegisterRoutes()が呼び出されます。簡単になりましたが、RegisterRoutes2()も呼び出されます。そして、完了、アプリケーションの再起動、またはビルドのクリーンアップが実行されます。

0
Hitesh Nagpal