自分用メモ。随時更新。
方針
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に関係ない処理なんて思いつかないもんね。