ここから実際の作業に入っていくが、その前に、本稿で行う大まかな移行/共存手順を紹介する。
(1)アセンブリ参照の追加
(2)プロジェクト・ファイル(拡張子「.csproj」ファイル)の修正
(3)Web.configファイルの修正
(4)Global.asax.csファイルの修正
(5)MVCで利用するフォルダやファイルの作成
(6)マスター・ページの修正
以上で、Webフォームで作成されたプロジェクトをMVCに移行し、共存できるようになる。それでは、詳細を説明していこう。
まずは、WebフォームのプロジェクトにMVCで利用するアセンブリを追加する。ソリューション・エクスプローラの[参照設定]を右クリックし、以下のアセンブリを追加してほしい。カッコの中はアセンブリ・バージョンだ。
次に、プロジェクト・ファイルをテキスト・エディタで開き、以下のとおり修正する。
<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>
<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>要素を編集することで開けるようになることもある。仮に開けてもビルドできないこともあるので「やらないよりマシ」といった程度ではあるが、そのような対策があることは覚えておいて損はないだろう。
続いて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>
<compilation>要素は、アプリケーションのコンパイル時の振る舞いを決定する設定を行うための要素だ。<assemblies>要素は、ページのコンパイル時に参照されるアセンブリを指定する。今回は、MVCで作成されたビューをコンパイルするために必要なアセンブリを追加している。<pages>要素は、アプリケーション全体のページ・ディレクティブの既定値を設定できる。<namespaces>要素は、ASP.NETのプリコンパイル時に参照する名前空間を設定する。具体的には、ここで指定した名前空間は全てのページにおいてインポートされていることになる。
続いて、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}
);
}
……省略……
}
「Global.asax.cs」は、MVCプロジェクトを作成したときに自動で作られる同名ファイルの記述を、既存のWebフォーム側のファイルにマージする形で進めればよい。
Copyright© Digital Advantage Corp. All Rights Reserved.