Introduce 
Razor 
2014/10/17 
Template Engine Night 
do_aki
@do_aki 
@do_aki 
http://do-aki.net/ 
2
I 
PHP
Razor はASP.NET の一部 
• 正式には 
Razor view engine 
• Razor 構文 
• Webに特化したテン 
プレートエンジン 
• コードを埋め込める 
(C# / VB) 
http://msdn.microsoft.com/ja-jp/magazine/gg983489.aspx
<% ~ %> 
<%=~ %>
<% ~ %> 
<%=~ %>
Razor Syntax
Example 
@{ 
var label = “<label>”; 
var value = 999; 
} 
<h1>@label</h1> 
<p>value is @(value+1).</p> 
<h1>&lt;label&gt;</h1> 
<p>value is 1000.</p>
if 
@{ 
var now = DateTime.Now; 
} 
今日は@now.ToShortDateString() です。 
@* 時刻によって挨拶切り替える*@ 
@if (now.Hour < 12) { 
<p>おはよう</p> 
} else if (21 <= now.Hour) { 
<text>おやすみ</text> 
} 
今日は2014-10-17 です。 
(時刻によっては“<p>おはよう</p>” もしくは“おやすみ” も表示 
される)
foreach 
@{ 
var ary = new int[] { 1, 1, 2, 9 }; 
} 
@foreach (var val in ary) { 
if (0 < val) { 
<text>value is @val</text> 
} 
}
Layout 
layout.cshtml 
header 
@RenderBody 
footer 
body.cshtml 
@{ 
Layout = “layout”; 
} 
body 
header 
body 
footer
どうやって使う? 
• VisualStudio (Express 2003 for Web) 
– http://www.visualstudio.com/ 
– 「新しいWebサイト」(ASP.NET Web サイト) 
でさくっと試せる。 
• WebMatrix 
– http://www.microsoft.com/web/webmatrix/ 
– 使ったことない 
– Wordpress を簡単に動かせるとからしい
当然Windows
当然ASP.NET
ASP.NET なんて使わねーよ>< 
という人には
RazorEngine
RazorEngine works in .NET app 
var tpl = "My Name is @Model.Name !"; 
var model = new { Name = "do_aki" }; 
MessageBox.Show( 
RazorEngine.Razor.Parse(tpl, model) 
); 
 WinForms ok 
WPF ok 
 Console ok 
Nuget でさくっと入るので便利 
https://www.nuget.org/packages/RazorEngine/
layout in RazorEngine 
var layout = @" 
header 
@RenderBody() 
footer"; 
RazorEngine.Razor.Compile(layout, "mylayout"); 
var body = @" 
@{ 
Layout = ""mylayout""; 
} 
body"; 
var compiled = RazorEngine.Razor.Parse(body, model);
実装とか
Source code 公開されてる 
• Razor view engine 
– http://aspnetwebstack.codeplex.com/ 
– Apache License 2.0 
• RazorEngine 
– https://github.com/Antaris/RazorEngine 
– Microsoft Public License
Code Reading!
C# 力が足りない
先人の知恵を借りた
1. コード部とマークアップ部に分解しつつ 
構文木を構築 
2. コード部はそのまま、マークアップ部は 
Write メソッド呼び出し等に変換し 
て.NET のコード(正確には 
CodeCompileUnit )を生成 
(これが実行可能なclass となる) 
3. 2. のインスタンスを作成し、適宜プロパ 
ティを設定して実行する 
Template life cycle
@{ 
@{ 
now = DateTime.Now; 
} 
今日は@now.ToShortDateString() です。 
@* 時刻によって挨拶切り替える*@ 
@if (now.Hour < 12) { 
<p>おはよう</p> 
} else if (21 <= now.Hour) { 
<text>おやすみ</text> 
コード部とマークアップ部に分離 
} 
var now = DateTime.Now; 
} 
今日は@now.ToShortDateString() です。 
@* 時刻によって挨拶切り替える*@ 
@if (now.Hour < 12) { 
<p>おはよう</p> 
} else if (21 <= now.Hour) { 
<text>おやすみ</text> 
}
@{ 
var now = DateTime.Now; 
} 
今日は@now.ToShortDateString() です。 
@* 時刻によって挨拶切り替える*@ 
@if (now.Hour < 12) { 
<p>おはよう</p> 
} else if (21 <= now.Hour) { 
<text>おやすみ</text> 
} 
code 
m m 
markup 
m 
code 
code 
code 
c 
コード部とマークアップ部に分離
public class __CompiledTemplate { 
public void Execute() { 
var now = DateTime.Now; 
WriteLiteral(“今日は“); 
Write(now.ToShortDateString()); 
WriteLiteral (” です。rn”); 
if (now.Hour < 12) { 
WriteLiteral(“<p>おはよう</p>”) 
} else if (21 <= now.Hour) { 
WriteLiteral(“おやすみ”) 
class を構築 
} 
} 
(実際にはCodeDom.CodeCompileUnit) 
}
• あとはインスタンス生成してプロパティ 
割り当てて実行するだけ。 
• 実行にはRazor 関わってない 
• .NET のVM に載る感じ 
• 速いんじゃないかな 
実行
まとめ 
• ASP.NET のTemplate Engine であるところの 
Razor を紹介しました 
• RazorEngine を使えば.NET アプリケーショ 
ンでも簡単に利用できます 
• CodeDom 面白そう
ちなみに、yii (PHP)でRazor 構 
文っぽいノを使えるものあるら 
しい 
• yii-razor-view-render 
• https://code.google.com/p/yii-razor-view-render/
いじょー 
2014/10/17 
Template Engine Night 
do_aki

20141017 introduce razor

  • 1.
    Introduce Razor 2014/10/17 Template Engine Night do_aki
  • 2.
  • 3.
  • 4.
    Razor はASP.NET の一部 • 正式には Razor view engine • Razor 構文 • Webに特化したテン プレートエンジン • コードを埋め込める (C# / VB) http://msdn.microsoft.com/ja-jp/magazine/gg983489.aspx
  • 5.
    <% ~ %> <%=~ %>
  • 6.
    <% ~ %> <%=~ %>
  • 7.
  • 8.
    Example @{ varlabel = “<label>”; var value = 999; } <h1>@label</h1> <p>value is @(value+1).</p> <h1>&lt;label&gt;</h1> <p>value is 1000.</p>
  • 9.
    if @{ varnow = DateTime.Now; } 今日は@now.ToShortDateString() です。 @* 時刻によって挨拶切り替える*@ @if (now.Hour < 12) { <p>おはよう</p> } else if (21 <= now.Hour) { <text>おやすみ</text> } 今日は2014-10-17 です。 (時刻によっては“<p>おはよう</p>” もしくは“おやすみ” も表示 される)
  • 10.
    foreach @{ varary = new int[] { 1, 1, 2, 9 }; } @foreach (var val in ary) { if (0 < val) { <text>value is @val</text> } }
  • 11.
    Layout layout.cshtml header @RenderBody footer body.cshtml @{ Layout = “layout”; } body header body footer
  • 12.
    どうやって使う? • VisualStudio(Express 2003 for Web) – http://www.visualstudio.com/ – 「新しいWebサイト」(ASP.NET Web サイト) でさくっと試せる。 • WebMatrix – http://www.microsoft.com/web/webmatrix/ – 使ったことない – Wordpress を簡単に動かせるとからしい
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
    RazorEngine works in.NET app var tpl = "My Name is @Model.Name !"; var model = new { Name = "do_aki" }; MessageBox.Show( RazorEngine.Razor.Parse(tpl, model) );  WinForms ok WPF ok  Console ok Nuget でさくっと入るので便利 https://www.nuget.org/packages/RazorEngine/
  • 18.
    layout in RazorEngine var layout = @" header @RenderBody() footer"; RazorEngine.Razor.Compile(layout, "mylayout"); var body = @" @{ Layout = ""mylayout""; } body"; var compiled = RazorEngine.Razor.Parse(body, model);
  • 19.
  • 20.
    Source code 公開されてる • Razor view engine – http://aspnetwebstack.codeplex.com/ – Apache License 2.0 • RazorEngine – https://github.com/Antaris/RazorEngine – Microsoft Public License
  • 21.
  • 22.
  • 23.
  • 24.
    1. コード部とマークアップ部に分解しつつ 構文木を構築 2. コード部はそのまま、マークアップ部は Write メソッド呼び出し等に変換し て.NET のコード(正確には CodeCompileUnit )を生成 (これが実行可能なclass となる) 3. 2. のインスタンスを作成し、適宜プロパ ティを設定して実行する Template life cycle
  • 25.
    @{ @{ now= DateTime.Now; } 今日は@now.ToShortDateString() です。 @* 時刻によって挨拶切り替える*@ @if (now.Hour < 12) { <p>おはよう</p> } else if (21 <= now.Hour) { <text>おやすみ</text> コード部とマークアップ部に分離 } var now = DateTime.Now; } 今日は@now.ToShortDateString() です。 @* 時刻によって挨拶切り替える*@ @if (now.Hour < 12) { <p>おはよう</p> } else if (21 <= now.Hour) { <text>おやすみ</text> }
  • 26.
    @{ var now= DateTime.Now; } 今日は@now.ToShortDateString() です。 @* 時刻によって挨拶切り替える*@ @if (now.Hour < 12) { <p>おはよう</p> } else if (21 <= now.Hour) { <text>おやすみ</text> } code m m markup m code code code c コード部とマークアップ部に分離
  • 27.
    public class __CompiledTemplate{ public void Execute() { var now = DateTime.Now; WriteLiteral(“今日は“); Write(now.ToShortDateString()); WriteLiteral (” です。rn”); if (now.Hour < 12) { WriteLiteral(“<p>おはよう</p>”) } else if (21 <= now.Hour) { WriteLiteral(“おやすみ”) class を構築 } } (実際にはCodeDom.CodeCompileUnit) }
  • 28.
    • あとはインスタンス生成してプロパティ 割り当てて実行するだけ。 • 実行にはRazor 関わってない • .NET のVM に載る感じ • 速いんじゃないかな 実行
  • 29.
    まとめ • ASP.NETのTemplate Engine であるところの Razor を紹介しました • RazorEngine を使えば.NET アプリケーショ ンでも簡単に利用できます • CodeDom 面白そう
  • 30.
    ちなみに、yii (PHP)でRazor 構 文っぽいノを使えるものあるら しい • yii-razor-view-render • https://code.google.com/p/yii-razor-view-render/
  • 31.

Editor's Notes

  • #13 関係ないけど、商用製品のロゴって安易に使えなくてメンドイよね。どこまでがフェアユースとして認められるのかわかりにくい。