Razor構文の導入とASPXの選択基準
ASP.NETの新しいビューエンジンとしてRazorがあります。Razorとは、"@"を頭文字に記載することで利用できる構文で、ヘルパークラスなどの活用によりシンプルで効率的な記法ができるのが最大の特徴です。従来のASPXによるビューエンジンももちろん選択できますので、開発者にとって利用しやすい方を選択できることになります。
Razorについてはすでに各種記事で紹介されているのでご存知の方も多いかと思いますが、本稿ではMVC 3においてRazorを使うメリットとデメリット、ASPXを使うメリットとデメリットを見てみたいと思います。
まず、それぞれのビューエンジンの構文です。
// Razor構文 @ViewBag.Message // ASPX構文 <%: ViewBag.Message %>
上のRazor構文は"@"1文字で記載できていますが、ASPX構文では "<%: %>"と、スペースを省いても5文字入力する必要があります。これが良くも悪くもRazorを使うかASPXを選択するかのポイントの一つになります。アプリケーションを作る中で"View"は何かと編集します。その中で日常的に使うにはタイプ数を減らして流れに乗ったコーディングを行いたい開発者も多いはずです。そんな時に1文字で済むRazor構文は魅力的ではないでしょうか。
他にもデザインビューを利用できるかどうか、サーバーコントロールを利用できるかどうかという部分も選択のポイントになります。Razorを選択した場合はサーバーコントロールを利用できないため、WebFormや、Dynamic Dataのハイブリッドアプリケーションはできないということになります。
まとめると以下のようになります。
Razor | ASPX | |
総タイプ量 | 少ない | 若干多い |
サーバーコントロールの利用 | できない | できる |
Dynamic Dataの同一プロジェクト利用 | できない | できる |
デザインビューの確認 | できない | できる |
パフォーマンス | 若干遅い | 今までと変わらない |
なお、RazorとASPXそれぞれのパフォーマンスは、ほぼ変わらないようです。話題のRazorはもちろん魅力的なビューエンジンではありますが、ビューエンジンの違いを把握したうえで開発者ならびに、開発チームにあった方をビューエンジンとして選択するようにしましょう。
ViewDataからViewBagへ
MVC 2までは、ViewModelやViewDataを利用してコントローラーからビューへ値を渡していました。MVC 3では、ViewBagと名前を統一してコントローラー側とビュー側両方で同一の名前のオブジェクトとして利用できるようになりました。
ViewBagは動的なコレクションです。コントローラー側で下記のように記載できます。
ViewBag.Name = "ナオキ"; ViewBag.Age = 28; ViewBag.娘 = "環"; ViewBag.DateTime = DateTime.Now; ViewBag.LikeColor = "blue";
お気づきでしょうか。ViewBag."XXX"のXXXの部分は利用者が任意の名前を付けて値を格納できます。つまり、格納したい値を複数指定できるのでコントローラーからビューへ渡したい分だけ指定できます。ビュー側で値を引き出すには下記のような記載になります。
<h3>ViewBagサンプル</h3> <p> 名前:<b>@ViewBag.Name</b><br /> 年齢:<b>@ViewBag.Age</b><br /> 娘:<b>@ViewBag.娘</b><br /> 日時:<b>@ViewBag.DateTime</b></br > 色:<b><font color="@ViewBag.LikeColor">青</font> </b> </p>
コントローラー側と同じ記載で表示できるので利用しやすいです。実行結果は図5のとおりです。
便利なViewBagですが、一点注意点があります。ViewBagは何個でも任意の名前のフィールドで値を格納できる特徴の代償としてインテリセンスが効きません(ビュー側でもViewBag.XXXのXXX部分は手入力が必要)。この点だけ注意が必要です。
セッションステートの指定
MVC 2まではすべてのコントローラーでセッションが使用されていました。MVC 3ではSessionState属性にSessionStateBehavior列挙体を指定することで、セッションレスで利用することもできるようになりました。
設定値 | 概要 |
Default | 従来のコントローラー同様の要求に応じたセッションステートを使用 |
Required | 読み書き可能なセッションステートを使用 |
ReadOnly | 読み取り専用セッションステートでコントローラーを使用 |
Disabled | セッションレスでコントローラーを使用 |
指定は属性で宣言するだけです。
using System.Web.SessionState; [SessionState(SessionStateBehavior.Disable)] public class HomeController : Controller { }
セッションを使用しない場合はセッションレスに指定することで運用環境でのトラブル防止にもつながる部分になると思います。
AllowHTML属性
MVC 3になり属性クラスも多く追加されています。今回ピックアップするAllowHTML属性はHTML文字列を有効化したい場合に使用します(MVCでは、デフォルトですべての文字列をフレームワーク側がエスケープしてただの文字列として処理します)。
例えば、Blogやフォーラムの編集画面作成時などでは活躍する属性です。
public class Blog { public string Name { get; set; } public string Title { get; set; } [AllowHtml] public string Content { get; set; } ... }
指定したプロパティまたはクラスでのみHTML文字列を有効化できます。