web-dev-qa-db-ja.com

ASP.Net MVCを既存のWebサイトプロジェクトにどのように振りかけますか?

Visual Studio 2008 SP1にレガシー(haha)ASP.NetWebフォームWebサイトプロジェクトがあります、いくつかのMVC機能を徐々に導入したいと思います。

ASP.Net MVCをWebFormsと統合する方法について私が見つけることができる情報のほとんどは、Webアプリケーションプロジェクトの使用を想定しているようです。ただし、既存のASP.netWebサイトプロジェクトをASP.NetMVC機能で後付けする方法に関する情報を見つけることは不可能のようです。

私は彼の次の本の Scott Hanselmanの投稿第13章 をレビューしました。どちらもWebアプリケーションプロジェクトタイプを想定しています。 。

これは可能ですか?誰かがこれに関するハウツーを持っていますか?

46
Kris

初心者にとっては、MVCをWebフォームプロジェクトに追加するのは非常に簡単です。VS2008forMVCの機能を取得するには、もう少し作業が必要です(それでも簡単です)。まず、アセンブリを参照し、.Net3.5を使用していることを確認する必要があります。次に、現在のWebフォームプロジェクトにcontrollersフォルダーとviewsフォルダーを作成できます。インデックスアクションを使用して単純なコントローラーを作成することもできます。次に、global.ascxファイルでルートを設定/構成します。そこから設定する必要があります。参照用に ここ を確認してください。

ただし、コードビハインドを使用してaspxページを作成することしかできません(それらを削除して、マークアップに適切な継承クラスを入力できます)。プロジェクトタイプを実際に「変換」して、MVCとビジュアルスタジオの良さを得るには(新しいビューの追加、コントローラーへの移動など)、いろいろと試してみる必要があります。私の最善のアドバイスは、VS2008で新しいMVCプロジェクトと新しいWebAppプロジェクトを作成し、プレーンテキストの.csprojファイルを比較することです。 VSにプロジェクトテンプレートを伝える長い文字列値があります。

これはうまくいくと私を信じてください。私は以前に自分のレガシープロジェクトでそれを行いました。試行/エラー/削除以外に、プロジェクトタイプ「キー」をどのように見つけたか覚えていません。 ASP.Net MVCは、Webフォームと同じプロジェクトでNiceを再生します。

UPDATE:。csprojファイルのPropertyGroupでこれらを使用することにより、MVCプロジェクトタイプに変更できると思います。これは引き続きWebアプリケーションです。それらをあなたが持っているものと比較し、異なるものを変更してください、必ずファイルをコピー/バックアップしてください。

<ProjectGuid>{B99EC98A-1F09-4245-B00D-5AF985190AA9}</ProjectGuid>
<ProjectTypeGuids>{603c0e0b-db56-11dc-be95-000d561079b0};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>

更新2:プロジェクトに影響を与えたり、プロジェクトに大きな影響を与えたりすることはありません。不安な場合は、バックアップを作成して遊んでください。変更が発生した場合は、常にバックアップがあります。最初は懐疑的でしたが、MVCパスをたどってよかったです。

24
Kyle LeNeau

Visual Studio 2010 SP1/NuGet/ScottHanselmanの完全にサポートされていないユーティリティを使用して最新の回答を提供すると思いました。

  1. MVC3をインストールします(nuget付き) http://www.asp.net/mvc/mvc
  2. Visual Studioの[ツール]メニューに移動し、[ライブラリパッケージマネージャー]\[パッケージマネージャーコンソール]を選択します
  3. コンソールウィンドウが表示されたら、「デフォルトプロジェクト」をWebフォームプロジェクトに変更します。
  4. 「Install-PackageAddMvc3ToWebForms」と入力します( http://nuget.org/List/Packages/AddMvc3ToWebForms

これにより、必要なすべてのdll、javascriptファイル、web.config設定の変更などがプロジェクトに追加されます。すべてが成功した場合は、F5キーを押して、Webサイトの「ホーム」に移動し、mvcによってレンダリングされたサンプルフォームを表示できます。「ASP.NETMVCへようこそ。NuGetパッケージで完全にサポートされていない方法でアップグレードされました。ヘンゼルマン!保証なし!」.

19
Jason

WebSiteプロジェクトの場合、ルートではなく、App_Codeにコントローラーを追加する必要があります。 csprojファイルなしでMVCを使用していることを認識していないため、VSの優れた点を見逃すことになりますが、実際には機能します。

ControllerとViewPageから継承することを忘れないでください。そうすれば、うまくいくはずです。

7
Mark Brackett

私はかなり大きなASP.NETWebサイト(Webアプリケーションではない)を持っていて、それにMVC3を追加したいと思っていました。プロジェクトの種類を変更するオプションがなかったため、Webサイト(asp.net 4.0)にアクセスする必要がありました。

別のMVCプロジェクトを使用していますが、それ自体のWebアプリケーションとしてではなく、古いWebサイト内のアセンブリとして使用しています。

これが私がしたことの要約です:

  • Visual Studio2010で新しいMVC3Webアプリケーションを作成し、空のテンプレートとRazorビューエンジンを使用しました。
  • 既存のWebサイトでソリューションに追加しました。
  • アセンブリの出力パスをローカルのbinディレクトリからWebサイトのbinディレクトリに変更しました。
  • MVCアプリから「Content」フォルダーと「Scripts」フォルダーを削除しました。コンテンツとスクリプトの両方がすでに私のWebサイトの一部であり、MVCの「ページ」からもこれらを参照できます。
  • Global.asax。*ファイルをプロジェクトから削除しました。 WebサイトでGlobal.asaxを使用しています。
  • 'Views'フォルダーとサブフォルダーをWebサイトにコピーしました。これらは実際のファイルであり、アセンブリの一部ではないため、MVCアセンブリをビルドするプロジェクトではなく、Webサイト内に存在する必要があります。
  • この時点で、MVCプロジェクトから「Views」フォルダーを削除できた可能性がありますが、新しいビューを追加するためのVisualStudioサポートを取得できるのはこのプロジェクトタイプのみです。そのため、ここでビューを作成してから、それをWebサイトに移動することがあります。 Webサイトでcshtmlファイルを編集しても、完全なIntellisenseを取得できます。
  • Webサイトにルーティングを追加しました。 Webサイトのglobal.asaxにあるMVCglobal.asaxからコードをコピーしました。いくつかの使用法が必要です:

    using System.Web.Mvc;
    using System.Web.Routing;
    

Application_Startには、次のものが必要です。

    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

次に、通常のルーティング方法を追加します。

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // your routes
    }

次に、Webサイトのweb.configにいくつか追加します。コンパイル中のsystem.webでは、次のアセンブリが必要です。

     <assemblies>
        <add Assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add Assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add Assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add Assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add Assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>

最初に、いくつかのMVC名前空間もweb.configに追加しましたが、それらがなくても問題なく動作するようです。

ここで、WebサイトのGlobal.asaxに新しいルートを作成し、MVCプロジェクトに対応するコントローラーを追加してから、Webサイトに戻ってビューを追加します。したがって、ビューとルーティングがWebサイトで定義されている間、ロジックはすべてアセンブリ内にあります。

ブレークポイントを設定することでMVCコントローラーにデバッグできますが、Webサイトを起動してデバッグします。

MVCの推奨されるデフォルトルートを使用する場合:

        routes.MapRoute("Default", "{controller}/{action}/{id}", 
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

www.mysite.comに電話をかけると、古いdefault.aspxホームページではなく、ホームコントローラー/ビューのコンテンツが提供されるため、このようなルートは使用しません。ルートが既存の物理フォルダーおよびファイルと競合する場合は、ルートで正規表現を使用して制約を使用し、そのような競合を除外します。

Webサイトでマスターページを使用していますが、共通ページパーツの実際のhtmlは、別のアセンブリのコードによって作成されています。 _ViewStart.cshtmlまたはベースコントローラーから同じメソッドを呼び出すことができます。

これまでのところ、私はこのアプローチについて本当のネガティブを見たことがありません。

6
Peter Hahndorf

Web.configでルーティングを設定し、必要なディレクトリ構造を設定し、global.asaxに正しいルートを追加する限り、理論的にはMVCアイテムを任意のWebプロジェクトに追加できます。私の知る限り、それが機能するための唯一の要件です。

ただし、この2つの組み合わせは、少し混乱し、長期的に維持するのが難しい場合があります。たぶん、既存のすべてのWebフォームサイトコンテンツをサブフォルダーに移動して邪魔にならないようにし、サイトのルートディレクトリをクリーンに保って、混乱を減らし、物事をより明確にすることができます。

2
Chris

Webプロジェクトではなくasp.netWebサイトにMVC3を追加する場合は、Scott HanselmanのAddMvc3ToWebForms nugetパッケージを使用すると99%の方法でアクセスできますが、インストール中にエラーが発生するため、無視してかまいません(少なくとも私のテストではこれが当てはまるようです)、インストール後にいくつかの簡単な手順が必要です。

http://delradiesdev.blogspot.com/2011/08/adding-mvc-3-to-aspnet-web-site.html の詳細

マーク(@delradie)

1
Mark Middlemist

Web開発に関するMicrosoft.NET 4.0試験(70-519)には、準備資料にほぼこの正確な質問があります。 Microsoftによれば、その答えは次のとおりです。

  1. WebフォームWebサイトをWebアプリケーション(つまり、Webアプリケーションプロジェクト)に変換します。
  2. Webappの構成ファイルに「ASP.NETMVC2アセンブリ」への参照を追加します。

この情報は、私の雇用主が購入した有料の資料に含まれているため、リンクできることを明確に示すWebページは必ずしもありません。

0
Lisa

MVC2アプリケーションを移行しようとしているときに私が学んだことは、プロジェクトにはDefault.aspxが必要だということです。既存のWebサービスプロジェクトにいくつかのGUI関数を追加する必要があったため、default.aspxはありませんでした。ルートが設定されていない理由を理解するのに少し時間がかかりました。

0
Chris Kemp