Razorメモ

言語はC#

レイアウト

  • いままでのマスターページに替わって、Razorではレイアウトページという仕組みを使う。
  • 共通のレイアウトページは_ViewStart.cshtmlで指定される。(デフォルトでは_Layout.cshtml)
<!-- _Layout.cshtmlサンプル -->

<!DOCTYPE html>
<html>
<head>
  <title>@ViewBag.Title</title>
  <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
  <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
</head>

<body>
  <div id="header">
    @* requiredパラメーターをfalseにすることで、Viewページでの記述がオプション扱いになる。 *@ 
    @RenderSection("header", false)
  </div>
  <div id="body">
    @RenderBody()
  </div>
  <div id="footer">
    @RenderSection("footer", false)
  </div>
</body>
</html>

ビュー

@model List<RazorSample.ViewModels.PersonalViewModel>


@{
    //MVC3からはViewDataの代わりに、ViewBagを使用する。
    ViewBag.Title = "List";
    var qrUrl = ViewBag.QrUrl;
}

@* ヘッダー --------------------------------------------------- -------------------> *@
@section header{
    <h2>PersonalList</h2>
}


@* フッター------------------------------------------------------------------------> *@
@section footer{
    <p>現在日時: @DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")</p>

    @* 出力する際にタグが必要ない場合は、textタグで囲む。 
    主に、Htmlヘルパーを呼び出す際に使用するのだと思われる。*@
    <text>
        @* http://blogs.msdn.com/b/chack/archive/2011/02/28/asp-net-mvc-3-webmatrix-razor-helper-nuget.aspx *@
        @QRCode.Render(@qrUrl)
    </text>
}


@* ボディ--------------------------------------------------------------------------> *@
<table border="1">
    <tr>
        <th>名前</th>
        <th>性別</th>
        <th>年齢</th>
        <th>住所</th>
        <th>メールアドレス</th>
        <th>ひとこと</th>
    </tr>

@{
    var sexCount = new int[2];
    sexCount.Initialize();
}

@for (var i = 0; i < Model.Count; i++)
{
    @* コードブロック直下であれば自由に変数を定義することができる。  *@
    var p = Model[i];
    var sex = @p.SexCode == 0 ? "男" : "女";
    
    <tr>
        <td>@p.Name</td>
        <td>@sex</td>
        <td>@p.Age</td>
        <td>@p.Address</td>
        <td>@p.Email</td>
        @if (String.IsNullOrEmpty(p.Comment))
        { 
            <td>特になし</td>
        }
        else
        { 
            <td>@p.Comment</td>
        }

        @* 処理を記述する場合、コードブロック直下で記述すること。そうしないと処理コード自体がhtml出力されてしまう。
            何かしらのタグ内で行う場合は新たにコードブロックで囲む必要がある。

            //性別毎人数カウント処理
            @{
                sexCount[p.SexCode]++;
            }
        *@
    </tr>
    
    @* カウントアップ処理 *@
    sexCount[p.SexCode]++;
}

</table>

@* "@(〜)"  *@
<pre>
@(
    "合計:" + Convert.ToInt32(sexCount[0] + sexCount[1]) + " ([内訳]男:" + sexCount[0] + "、女:" + sexCount[1] + ")"
)
</pre>

モデルとコントローラー

public class PersonalViewModel
{
  public string Name { get; set; }
  public string Address { get; set; }
  public int SexCode { get; set; }  //0:男、1:女
  public int Age { get; set; }
  public string Comment { get; set; }
  public string Email { get; set; }
}

public class HomeController : Controller
{
    //
    // GET: /Home/

    public ActionResult Index()
    {
        var model = new List<PersonalViewModel>();
        model.Add(new PersonalViewModel
        {
            Name = "山田太郎"
            ,
            Age = 20
            ,
            SexCode = 0
            ,
            Address = "宮城県"
            ,
            Email = "yamada@yamada.com"
            ,
            Comment = "山田さんちの長男。要注意。"
        });
        model.Add(new PersonalViewModel
        {
            Name = "野田信子"
            ,
            Age = 21
            ,
            SexCode = 1
            ,
            Email = "nobu444@nodada.com"
            ,
            Address = "埼玉県"
        });
        model.Add(new PersonalViewModel
        {
            Name = "木場まき"
            ,
            Age = 23
            ,
            SexCode = 1
            ,
            Address = "山梨県"
            ,
            Email = "maki@key-ba.com"
            ,
            Comment = "客先の人"
        });

        ViewBag.QrUrl = "http://yahoo.co.jp/";

        return View(model);
    }
}

宣言的なHTMLヘルパー

部分ビューページのRazor対応版といったところ?
App_Codeフォルダ以下に配置すること。
<!-- HTMLヘルパーサンプル (PersonalGridRow.cshtml) -->

@helper Render(RazorSample.ViewModels.PersonalViewModel m)
{
    var sex = @m.SexCode == 0 ? "男" : "女";
    
    <tr>
        <td>@m.Name</td>
        <td>@sex</td>
        <td>@m.Age</td>
        <td>@m.Address</td>
        <td>@m.Email</td>
        @if (String.IsNullOrEmpty(@m.Comment))
        { 
            <td>特になし</td>
        }
        else
        { 
            <td>@m.Comment</td>
        }
    </tr>
}
Htmlヘルパーの呼び出し
先ほどのヘルパー(PersonalGridRow)を呼び出してみた。
<!-- ビューのうち、変更部分のみ抜粋 -->
@for (var i = 0; i < Model.Count; i++)
{
    @PersonalGridRow.Render(Model[i])
    sexCount[Model[i].SexCode]++;
}