2010年4月28日水曜日

Areaを使ってみる その1

ASP.NET MVC 2の新しい機能であるAreaを使って、新しいエイリアスを追加した。今回はその方法を解説しよう。

Area自体を追加するのは至極簡単。Areaを追加したいプロジェクトを右クリック→Add→Areaで下図のダイアログが表示されるので名前を適当に入力してOK。


入力した名前のフォルダがAreasフォルダの下に下図のようにできる。


初期状態でControllers, Models, Viewsとフォルダがあるが、Viewsを除いてすべて空っぽだ。注目したいのはSandboxAreaRegistration.csだ。このクラスで追加したArea用のAreaNameとRouteを設定する。

最後に、とても重要なのだが、Global.asaxに下記のコードを追加する必要がある。

public static void RegisterRoutes(RouteCollection routes)
{
 AreaRegistration.RegisterAllAreas();
}

このコードを忘れると追加したAreaのRouteが登録されないので注意しよう。AreaRegistration.RegisterAllAreas()が呼ばれるとフレームワークがAreaRegistrationを継承したクラスがないかを探し回ってRouteを登録していくという寸法だ。以上でAreaの追加は完了だ。適当なControllerを新しく追加したAreaに登録し下記のようにアクセスしてみよう。

従来のリンク
http://www.my-clip.net/Clip/Index/

新しいAreaへのリンク
http://www.my-clip.net/Sandbox/MrGengo/Index/

次回はArea間のActionLinkなどについて解説する。

2010年4月27日火曜日

Html.RenderPartialのIntelliTraceがExceptionで大変

Visual Studio 2010のIntelliTraceを使い始めてまず目につくのが下図のようなExceptionの情報だと思う。


Html.RenderPartial("hogehoge")でascxを描写している箇所でFileNotFoundExceptionがいくつも放り出されている。おいおいまじかよ、これどうなってんの?と焦るかもしれないが、これは決して深刻な問題ではない。この現象はデバッグ時にASP.NET MVCがViewのパス解決をキャッシュしないために毎度発生している。なのでweb.configのcompilation debugをfalseにしてやればこの問題は発生しない。

<compilation debug="false">

ちなみにWebアプリをリリースする際にはdebugモードは常にfalseにするように心がけよう。さもなければ、下記のようなデメリットにさいなまれることになる。

  1. 初期ページコンパイルにより時間がかかる(いくつかの最適化バッチが走らないので)
  2. 実行スピードの低下(デバッグ情報が追加されるので)
  3. 使用メモリの増大
  4. スクリプトと画像のキャッシュ無効化

仮にひとつひとつのWebアプリケーションをチェックするのが面倒ならば、machine.config上に下記のセクションを追加してやれば、そのマシン上のWebアプリケーションはすべて強制的にリリースモードで実行される。

<configuration>
<system.web>
<deployment retail=”true”/>
</system.web>
</configuration>

2010年4月15日木曜日

WPF:デザインビューでカスタムコントロールがロードされない

WPFでカスタムコントロールを作成し、それをPage(またはWindow)に貼り付けると、Pageのデザインビューでカスタムコントロールが正しくロードされずに下図のような状態になることがままある。


で、エラーも一緒に検出されていて「Could not create an instance of 'Your control'」とロードに失敗したカスタムコントロールはこれだ!と指摘してくれている。が、個々のカスタムコントロールのデザインビューでは正常にUIを確認できるため、なぜPageに貼り付けた途端に動作しなくなるのかは皆目検討がつかない。それなので長々とGoogleした結果、やっと正解にたどり着いた。

Troubleshooting WPF Designer load failures

理由は色々と考えられるようなので、かなりの確認事項があるけれど、Expression Blendなんかを使ってデザイナーと共同作業する人はデザインビューが使えないと死亡遊戯だと思うので一読をおすすめする。

ちなみに私の場合は、別ファイルに保存してApp.xamlで統合されているResourceDictionaryがデザインタイムにロードできないせいで読み込みエラーが発生していた。そのような場合は個々のカスタムコントロールのXAMLにResourceDictionaryへの参照を以下のように追加してやれば良い。

<UserControl.Resources>
 <ResourceDictionary>
 <ResourceDictionary.MergedDictionaries>
 <ResourceDictionary Source="/Resources/MainWindowRes.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>

て、あああああああ、XAMLの構成を確認しようとしたらまたVS2008がハングった。むかつく。こいつはApp.xamlをいじるとすぐにハングしやがる。VS2010では解決済みらしいけれど、VS2010にファイルをアップデートするとExpression Blend 2が動かないというジレンマ。

2010年4月13日火曜日

Visual Studio 2010がリリース

MSDNの購読者ではなくともフリーのVisual Studio 2010 ExpressはこちらからDownloadできる(Expressは機能が個々に分割されているので要件にあわせて取得する必要がある。例:C#でWindows Formsアプリを作るならVisual C# 2010 Expressが必要。Webアプリを作るならVisual Web Developer 2010 Expressが必要、という按配)。

新機能をざっと紹介しようかとも思ったのだが、あまりにもたくさん機能があるので断念。代わりに良いブログポストがあったので下記に紹介しておく。

Visual Studio 2010 Released

2010年4月12日月曜日

Visual Studio 2010のJavaScriptインテリセンスがすごい

ScottGuのこのブログポスト(JavaScript Intellisense Improvements with VS 2010)がやばい。内容はVS 2010のJavaScriptに対するインテリセンスがすごいですよー、という話なのだが、確かにすごい。

ざっと説明すると、コーディングをしている間にVSが適時コード解析を行うので、変数を宣言して、何かしらの値を割り当てると、その値の型に基づいたインテリセンスをダイナミックに提供してくれる、という機能。

言葉で説明してもいまいち分からないと思うので、前述のブログポストからいくつかコードを抜粋させていただいた。

var foo = "Some string value";
foo.       // このときにstring用のインテリセンス(charAt, concatなど)が提供される

foo = 35;  // 数字を代入する
foo.       // ここではnumber用のインテリセンス(toPrecision, toStringなど)が提供される

(前述のブログポストにインテリセンスの使用風景が画像入りで説明がされているので、そちらを見た方がもっとわかりやすいと思う)

他にも、VS2008で対応されていたDOMのインテリセンスだけではなく、windowオブジェクトに対する動的変数、動的関数までもコーディングしていく端からインテリセンスが有効になるからたまらん。すごすぎる。早く使いたい。

2010年4月8日木曜日

EncodingとDecodingをクライアントアプリで行う .NET Framework 4.0

.NET Frameworkを使ったWindowsアプリで何かWeb用のデータなどを編集するようなものやURLをいじくるものの場合はEncoding、Decodingがしたくなるものだ。で、ASP.NETを使っている開発者ならばすぐにSystem.Web.dllにあるSystem.Web.HttpUtilityへと思いが飛び、HttpUtility.HtmlEncode(string), HttpUtility.HtmlDecode(string)を使おうとするのだが、Windowsアプリの初期状態のプロジェクトテンプレートにはSystem.Web.dllが含まれていないのでインテリセンスでは当然ながら見つからず、「あれ?あのユーティリティどこ(の名前空間)にあったっけ?」と思い出すまでやきもきするのだが、.NET Framework 4.0からはSystem.dllのSystem.Net名前空間にWebUtilityクラスが実装されたのでそのモヤモヤともついにおさらばだ。

WebUtilityのMSDN

以前からクライアントアプリなのにEndoding, DecodingするためだけにASP.NETのアセンブリを参照することに抵抗があったのでSystem.dllにWebUtilityが実装されて嬉しい限りだ。ちなみに今回の情報は下記のサイトから。

Encoding/Decoding URIs and HTML in the .NET 4 Client Profile