ラベル ASP.NET MVC 2 の投稿を表示しています。 すべての投稿を表示
ラベル ASP.NET MVC 2 の投稿を表示しています。 すべての投稿を表示

2011年1月5日水曜日

型付けされたページでModelがいつもオブジェクトになってしまう場合 ASP.NET MVC 2

以前とあるASP.NET MVCのプロジェクトをMVC2に変換をし、とあるページを追加したところ、そのページはある型(便宜上TestModelとする)を使用していたのだが、どうにもこうにもその型を認識してくれない。何をやってもObjectとしてしか認識されず非常にイライラしたのでここに解決方法を紹介しておく。

解決方法と言ってもViewsフォルダー配下のWeb.configを開き、下記部分を修正するだけだ。

これを
<pages
    validateRequest="false"
    pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
  <controls>
    <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
  </controls>
</pages>

こちらに変更する。
<pages
    validateRequest="false"
    pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
  <controls>
    <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
  </controls>
</pages>

これで正しく型が認識されるはずだ。

2010年5月6日木曜日

カスタムActionFilter その3

数ヶ月前にカスタムActionFilterの解説をしたが、今回はその補足を。

前回解説したものはAuthorizeAttributeから派生し、認証していないリクエストを他のURLへリダイレクトするというものだった。そのリダイレクトする箇所のコードは下記の通り。

string loginUrl = RedirectUrl();  
filterContext.HttpContext  
 .Response.Redirect(loginUrl, true);  

が、ASP.NET MVC 2にアップグレードしたら上記のコードが期待通りに動作しなくなったのでGoogleした結果、下記のように書き換える必要があった。

string loginUrl = RedirectUrl();  
filterContext.Result = new RedirectResult(loginUrl);

これで期待通りに指定のURLへリダイレクトされるはずだ。

2010年5月1日土曜日

Areaを使ってみる その2

今回はArea間をまたいだリンクの解説をする。

前回追加したAreaのリンク(http://www.my-clip.net/Sandbox/MrGengo/Index/)は下記のようになる。
Httml.ActionLink("Link Text", "Index", "MrGengo", new { Area = "Sandbox" }, null });

4つ目の引数でAreaを渡していることに注目して欲しい。ついでSandboxからDefaultのAreaへリンクする場合は下記のようになる。

Httml.ActionLink("Link Text", "Index", "MrGengo", new { Area = "" }, null });

Area=""でDefaultのAreaへの参照となる。

正直他にも書こうとした内容があったので2回に分けたのだが、思いのほか役に立ちそうにない情報なので今回は予想以上に短いブログポストになってしまった。

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年3月26日金曜日

Http GetでJsonをリクエストするとエラーになっちゃう

ASP.NET MVC 2もリリースされて一月ほどたち、正式リリースされてから機能にはキャッチアップすれば良いとPreview, RCと6回もリリースされているものをほぼすべて無視してきたので、MIX10でWhat's New in Microsoft ASP.NET MVC 2があったのには助かった。で、他のビデオやブログでもASP.NET MVCからMVC 2への移行はなんの問題もなくできる、とあったのだが、前述のVideoの中で大変気になる部分があった。それが、今回のブログポストのタイトルにもあるように、Http GetでJsonを取得(正確には返却)しようとするとエラーになるというところだ。まさにWTF。

これはMVC 2でJSONまわりのセキュリティが引き締められたために発生するエラーで、回避策は下記の通り。

// SomethingController.cs
public ActionResult GetJson()
{
 var hoge = "hoge";
 return new JsonResult { Data = hoge, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}

JsonResultのJsonRequestBehaviorにJsonRequestBehavior.AllowGetを指定してやれば良い。まぁJsonを返却する場合はPOSTでリクエストしろよ、という話かもしれないが、jqGridをがんがんに使っているプロジェクトでは無理な話なので、MVC 2に移行するときはしこしこと地道に書き直すしかない。そういえばjqGridの使い方を解説しようとずっと前に思い立ったままになっていたので、良い機会なのでデモページへのリンクを載せておく。

jqGrid demo

検索結果なんかを表示するのにひっじょうに便利なので一見することをおすすめする。