自分用メモ。随時更新。
方針
Razor構文はいろいろな書き方をサポートしているけど、コードの見やすさを重視して、使うパターンをなるべく少なくする方針です。これだけ覚えとけばOKというものを書きます。
基本編
変数や式の結果を出力
基本ですね。@()
を使うと変数や式の結果を出力できます。出力は自動でHtmlエスケープされます。
<span>@(Model.Title)</span> <span>@(TimeZoneInfo.ConvertTimeFromUtc(Model.Time, Model.UserTimeZone).ToString("yyyy-MM-dd HH:mm"))</span> <div class="exec_result_@(Model.Status == ExecStatus.Succeeded ? "suc" : "err")"></div>
Htmlエスケープしたくない場合は@Html.Raw()
を使います。
<head> @Html.Raw(Model.CommonCSSLink) .. </head>
foreach文を使う
@foreach (var item in Model.Shops) { ... }
if文を使う
@if (User.IsInRole("Admin")) { ... } else if (User.IsInRole("Operator")) { ... } else { ... }
ヘルパー関数を呼ぶ
次項を参照。
アンカー(リンク)を出力
Url.Action
で指定アクションのURLを出力したり、Html.ActionLink
で指定アクションのaタグを出力したりできます。
アクション以外にController名、Area名、URLパラメータなども指定可能です。
<a href="@Url.Action("Logout")">ログアウト</a> @Html.ActionLink("ログアウト", "Logout")
応用編
既定の名前空間を宣言する
よく使う名前空間があって、毎回cshtml
でusing
するのが面倒くさいときはViews\Web.config
に名前空間を定義すればOKです。
<system.web.webPages.razor> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> .. <add namespace="Mamemaki.TestApp.Models" /> <add namespace="Mamemaki.TestApp.ViewModels" /> <add namespace="Mamemaki.TestApp.Helpers" /> </namespaces> </pages> </system.web.webPages.razor>
URL、HTMLまたはAjax関連のヘルパー関数を拡張する
組み込み(WebViewPage
クラスを参照)で用意されているヘルパーは以下の3つ。
- UrlHelper
- HtmlHelper
- AjaxHelper
これらに関連する処理なら、以下のように拡張関数を定義してやればいいです。
/// <summary> /// 現在のコントローラー名を小文字で返します。 /// </summary> /// <param name="urlHelper"></param> /// <returns></returns> public static string CurrentController(this UrlHelper urlHelper) { return urlHelper.RequestContext.RouteData.Values["controller"].ToString().Trim().ToLower(); } /// <summary> /// 店舗写真のURLを返します。 /// </summary> /// <param name="urlHelper"></param> /// <param name="shop"></param> /// <returns></returns> public static string ShopImageThumb(this UrlHelper urlHelper, ShopInfo shop) { var routeValues = new RouteValueDictionary(); routeValues.Add("id", shop.ID); if (shop.LastModifiedDate.HasValue) routeValues.Add("time", shop.LastModifiedDate.Value.Ticks); return urlHelper.Action("ImageThumb", "Shops", routeValues); }
独自のヘルパーを定義する
独自のヘルパーを定義することも可能です。自分はそのような場面に出くわして無いので省略。
ほとんどの場面では組み込みのヘルパーを拡張すればよいと思います。だってビューの処理でHTMLに関係ない処理なんて思いつかないもんね。