MVCルートアプリケーション(マスターページとテーマを備えたポータル)を作成し、いくつかのWebFormsベースのサブプロジェクトを追加することは可能ですか(ポータルに統合したい既存のWebFormsアプリケーションがすでにあります)?
ナビゲーション(サイトマップ、URLルーティング)をどのように一元化しますか?
マスターページをどのように共有しますか?
リソースをどのように参照しますか(〜問題など)?
MVCルートアプリケーション(マスターページとテーマを備えたポータル)を作成し、いくつかのWebFormsベースのサブプロジェクトを追加することは可能ですか(ポータルに統合したい既存のWebFormsアプリケーションがすでにあります)?
ナビゲーション(サイトマップ、URLルーティング)をどのように一元化しますか?
マスターページをどのように共有しますか?
リソースをどのように参照しますか(〜問題など)?
WebフォームとMVCの組み合わせは完全に可能です。紹介については、ScottHanselmanによるこのブログ投稿を参照してください。
参考までに、私は昨日このタスクを実行することができました-既存のWebForms WebサイトにMVC機能を追加します-つまり、誰かに役立つ場合に備えて書くと思いました。
人々は「WebフォームアプリケーションをMVCとして書き直すのが最善の方法です」と言いますが、アプリケーションが十分に確立され、時間の経過とともにかなりの怪物に成長した場合、これに対するビジネスケースはほとんどありません(それでもうまく機能する可能性があります)。私の場合、このアプリケーションに新しい関数を実装するように依頼されました。最近、他のプロジェクトでMVCで開発していたので、この新しい関数をMVCで構築したいと思いました。これは私がしたことです:
新しいASP.NETMVC4アプリケーションを作成し、空のテンプレート(Razorを使用)を選択します
ロードしたら、[参照] > [参照]を右クリックして、既存のWebサイトのBinフォルダーに移動します。次に、既存のサイトで使用していたDLLを追加しました。参考までに、私はAjaxControlToolkitを使用しているので、NuGetから最新のものを追加することにしました。これにより、web.configファイルが自動更新されます。
次に、 Windowsエクスプローラーを開き、既存のWebサイトのルートフォルダーに移動しました。次に、Visual Studioを使用して、既存のサイトの最上位フォルダー構造(Binフォルダーを除く)を複製し、2つのサイトに同じ最上位フォルダー(ただし、MVC App_Start、Controllers、Models、およびViewsを持つ新しいプロジェクト)を作成しました。フォルダもありますが、明らかにビンではありません)。
セットアップが完了したら、 Windowsエクスプローラーの対応する最上位フォルダーからサブフォルダーとファイルをコピーして、ソリューションに貼り付けました。この方法で行うと、プロジェクトではサブフォルダーとコンテンツを直接コピーでき、Visual Studioを介して既存のアイテムを追加すると、ファイルのみがコピーされるため、時間を節約できます。注意:ルートフォルダについては、 web.configまたはGlobal.asaxにコピーしませんでしたが、他のすべてのファイル(default.aspxなど)にコピーしました。
すべてのコンテンツがコピーされたら、新しいプロジェクトでweb.configを開き、既存のサイトでweb.configを開きました。既存のWebサイトに固有のもの(appSettings、connectionStrings、名前空間、メンバーシップ情報など)を新しいweb.configにコピーしました。同じことがGlobal.asaxファイルにも当てはまります。
ビルドを試みて、見逃したものを修正しました。
すべてが正しくなると(そして、いくつかの黄色の死の画面を撃ち落とした)、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.NETWebFormsとMVCのハイブリッドができました。このタスクを実行するためのより簡単な方法があると確信していますが、他の方法を試しましたが失敗しました。この方法で約20分かかり、稼働していました...十分に座ってコーディングしていました:)
上記の素晴らしい答え。検討できるもう1つのことは、ASP.NETからASP.NET MVCへの移行です。この場合、この投稿はプロジェクトファイルの移行に役立つ可能性があります。
私はこの状況で立ち往生しすぎていました。結局のところ、うまくいった解決策を手に入れました。まず、web.config
ビューフォルダにコピーします。
その開いたRoute.config(Routeconfig)
ファイルの後に、1つのメソッドがありRegisterRoutes
、それをそのままにして、という名前の別のメソッドを作成RegisterRoutes2()
し、mvcアプリケーションから以下のメソッドコードをコピーして貼り付けます。
public static void RegisterRoutes2(RouteCollection routes)
{...}
場合によっては、MVCアプリのメソッド名はRegisterRoutesになります。上記のコードが機能しない場合は、マシンのMVCアプリケーションからコピーして貼り付けてください。次に、global.asax
ファイルに移動します。ここで、が呼び出されていることがわかります。RegisterRoutes()
今は簡単です。また、を呼び出しますRegisterRoutes2()
。これで、アプリケーションを再起動するか、クリーンビルドを実行します。