ASP.NET WebフォームからASP.NET MVCへの移行/共存特集:“Webフォーム+ASP.NET MVC”共存アプリ(2/4 ページ)

» 2013年08月05日 16時28分 公開
[熊家賢治,Sansan 株式会社(http://www.sansan.com/)]

ASP.NET MVCへの移行/共存

 ここから実際の作業に入っていくが、その前に、本稿で行う大まかな移行/共存手順を紹介する。

 (1)アセンブリ参照の追加
 (2)プロジェクト・ファイル(拡張子「.csproj」ファイル)の修正
 (3)Web.configファイルの修正
 (4)Global.asax.csファイルの修正
 (5)MVCで利用するフォルダやファイルの作成
 (6)マスター・ページの修正

 以上で、Webフォームで作成されたプロジェクトをMVCに移行し、共存できるようになる。それでは、詳細を説明していこう。

(1)アセンブリ参照の追加

 まずは、WebフォームのプロジェクトにMVCで利用するアセンブリを追加する。ソリューション・エクスプローラの[参照設定]を右クリックし、以下のアセンブリを追加してほしい。カッコの中はアセンブリ・バージョンだ。

  • System.ComponentModel.DataAnnotations(4.0.0.0)
  • System.Data.Entity(4.0.0.0)
  • System.Web.Abstractions(4.0.0.0)
  • System.Web.Helpers(1.0.0.0)
  • System.Web.Mvc(3.0.0.0)
  • System.Web.Routing(4.0.0.0)
  • System.Web.WebPages(1.0.0.0)

(2)プロジェクト・ファイルの修正

 次に、プロジェクト・ファイルをテキスト・エディタで開き、以下のとおり修正する。

<PropertyGroup>
  <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
  <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
  <ProductVersion>
  </ProductVersion>
  <SchemaVersion>2.0</SchemaVersion>
  <ProjectGuid>{F9E1C164-CC53-43FC-A488-554031FD07EF}</ProjectGuid>
  <ProjectTypeGuids>{E53F8FEA-EAE0-44A6-8774-FFD645390401};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>   …… (1)
  <OutputType>Library</OutputType>
  <AppDesignerFolder>Properties</AppDesignerFolder>
  <RootNamespace>WebApplication1</RootNamespace>
  <AssemblyName>WebApplication1</AssemblyName>
  <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
  <MvcBuildViews>false</MvcBuildViews>   …… (2)
  <UseIISExpress>false</UseIISExpress>
</PropertyGroup>

……省略……

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">   …… (3)
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>


リスト1 プロジェクト・ファイルの修正
  (1)<ProjectTypeGuids>要素に「E53F8FEA-EAE0-44A6-8774-FFD645390401」という値を追加する。
  (2)<MvcBuildViews>要素を追加する。追加する場所は<ProjectTypeGuids>要素の配下であればどこでも構わない。
  (3)<Target>要素を追加する。サンプル・アプリケーションのプロジェクト・ファイルでは、末尾にコメントアウトされた<Target>要素が存在するので、その近くに記述すればよいだろう。

 <ProjectTypeGuids>要素とは、プロジェクトの種類を表す識別子である。これは、プロジェクト・テンプレートとは異なるもので、例えば「Windows(C#)プロジェクト」「Web Applicationプロジェクト」「Testプロジェクト」などといったカテゴライズになるが、必ずしも全てのプロジェクトに付与されているわけではない*4。この要素に設定されている値によって、Visual Studioはその挙動を変えている。例えば、MVCプロジェクトを作成してソリューション・エクスプローラ内で右クリックするとコンテキスト・メニューに[追加]−[コントローラー]という項目が表示されるが、Webフォーム・プロジェクトでこの項目は表示されない、といった具合だ。

 <MvcBuildViews>要素とは、ビルド時にビューのビルドも行ってくれる機能である。ビューの構文エラーを早期に発見できるが、その分、毎回のビルド時間は延びてしまう。開発時には無効にしておき、デイリー・ビルドなど多少時間が掛かっても問題ないような状況で利用するとよいだろう。また、<Target>要素はMSBuildに実行させたいタスクを指定するための要素で、ここでは<MvcBuildViews>要素が有効に設定されていた場合のみ、配下のAspNetCompilerタスクを実行するよう指定している。<AspNetCompiler>タスクは「Aspnet_compiler.exe」というASP.NETアプリケーションのプリコンパイルを行うユーティリティをラップしたもので、<MvcBuildViews>要素と<AspNetCompiler>タスクを設定することで、アプリケーションのビルド時にビューのビルドも行われるようになる。詳細は「Turn on Compile-time View Checking for ASP.NET MVC Projects in TFS Build 2010(英語)」を参照してほしい。

*4 「List of known project type Guids(英語)」を参照。こちらのサイトでほかのプロジェクトのProjectTypeGuidを確認できる。


【コラム】「プロジェクトの種類がこのインストールでサポートされていません」

 Webからダウンロードしてきたプロジェクトなどを開く際に「プロジェクトの種類がこのインストールでサポートされていません」というエラーが表示されたことはないだろうか? 必ずしもうまくいくわけではないが、<ProjectTypeGuids>要素を編集することで開けるようになることもある。仮に開けてもビルドできないこともあるので「やらないよりマシ」といった程度ではあるが、そのような対策があることは覚えておいて損はないだろう。


(3)Web.configファイルの修正

 続いてWeb.configファイルの修正を行う。

<configuration>

  <system.web>
    <compilation debug="false" targetFramework="4.0">
      <assemblies>   …… (1)
        <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>
    </compilation>

    <pages>   …… (2)
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages"/>
      </namespaces>
    </pages>
  </system.web>

  ……省略……

</configuration>


リスト2 Web.configファイルの修正
  (1)<compilation>要素と<assemblies>子要素を追加する。
  (2)<pages>要素と<namespaces>子要素を追加する。

 <compilation>要素は、アプリケーションのコンパイル時の振る舞いを決定する設定を行うための要素だ。<assemblies>要素は、ページのコンパイル時に参照されるアセンブリを指定する。今回は、MVCで作成されたビューをコンパイルするために必要なアセンブリを追加している。<pages>要素は、アプリケーション全体のページ・ディレクティブの既定値を設定できる。<namespaces>要素は、ASP.NETのプリコンパイル時に参照する名前空間を設定する。具体的には、ここで指定した名前空間は全てのページにおいてインポートされていることになる。

(4)Global.asax.csファイルの修正

 続いて、Global.asax.csファイルを次のとおり修正しよう。

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

public class Global : System.Web.HttpApplication
{

  void Application_Start(object sender, EventArgs e)   …… (1)
  {
    // 以下の記述を追加
    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    // 既存処理
    ……省略……

  }

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

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

    // 以下のマッピングは、あくまで一例
    routes.MapRoute(
      "Default",
      "{controller}/{action}/{isbn}",
      new {controller = "Book", action = "Detail", isbn = UrlParameter.Optional}
    );
  }

……省略……

}

リスト3 Global.asax.csファイルの修正コード(C#)
  (1)Application_Startメソッドにルーティングやグローバル・フィルタの設定などの処理を追記する。
  (2)MVCで使用するグローバル・フィルタの登録処理を追記する。
  (3)MVCで使用するルーティングの詳細を追記する。ここで例示しているマッピングはあくまでサンプル用の例であるので、実際には各アプリケーションで必要となるマッピングを適宜追加していってほしい。

 「Global.asax.cs」は、MVCプロジェクトを作成したときに自動で作られる同名ファイルの記述を、既存のWebフォーム側のファイルにマージする形で進めればよい。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。