20141017 introduce razor

31
Introd uce Razor 2014/10/17 Template Engine Night do_aki

description

2014/10/17 Template Engine Night

Transcript of 20141017 introduce razor

Page 1: 20141017 introduce razor

Introduce Razor

2014/10/17 Template Engine Night

do_aki

Page 2: 20141017 introduce razor

@do_aki

@ do_aki

http://do-aki.net/2

Page 3: 20141017 introduce razor

I PHP

Page 4: 20141017 introduce razor

Razor は ASP.NET の一部

• 正式には Razor view engine

• Razor 構文• Web に特化したテン

プレートエンジン• コードを埋め込める

(C# / VB)

http://msdn.microsoft.com/ja-jp/magazine/gg983489.aspx

Page 5: 20141017 introduce razor

<% ~ %><%= ~ %>

Page 6: 20141017 introduce razor

<% ~ %><%= ~ %>

Page 7: 20141017 introduce razor

Razor Syntax

Page 8: 20141017 introduce razor

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>

Page 9: 20141017 introduce razor

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>” もしくは “おやすみ” も表示される )

Page 10: 20141017 introduce razor

foreach

@{var ary = new int[] { 1, 1, 2, 9 };

}

@foreach (var val in ary) {if (0 < val) {

<text>value is @val</text>}

}

Page 11: 20141017 introduce razor

Layout

header@RenderBodyfooter

@{Layout = “layout”;

}body

layout.cshtml

body.cshtml

headerbodyfooter

Page 12: 20141017 introduce razor

どうやって使う?

• VisualStudio (Express 2003 for Web)– http://www.visualstudio.com/–「新しい Web サイト」 (ASP.NET Web サイ

ト ) でさくっと試せる。

• WebMatrix– http://www.microsoft.com/web/webmatrix/–使ったことない– Wordpress を簡単に動かせるとからしい

Page 13: 20141017 introduce razor

当然 Windows

Page 14: 20141017 introduce razor

当然 ASP.NET

Page 15: 20141017 introduce razor

ASP.NET なんて使わねーよ><という人には

Page 16: 20141017 introduce razor

RazorEngine

Page 17: 20141017 introduce razor

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 okWPF okConsole ok

Nuget でさくっと入るので便利https://www.nuget.org/packages/RazorEngine/

Page 18: 20141017 introduce razor

layout in RazorEnginevar layout = @"header@RenderBody()footer";RazorEngine.Razor.Compile(layout, "mylayout");

var body = @"@{ Layout = ""mylayout"";}body";var compiled = RazorEngine.Razor.Parse(body, model);

Page 19: 20141017 introduce razor

実装とか

Page 20: 20141017 introduce razor

Source code 公開されてる

• Razor view engine– http://aspnetwebstack.codeplex.com/– Apache License 2.0

• RazorEngine– https://github.com/Antaris/RazorEngine– Microsoft Public License

Page 21: 20141017 introduce razor

Code Reading!

Page 22: 20141017 introduce razor

C# 力が足りない

Page 23: 20141017 introduce razor

先人の知恵を借りた

Page 24: 20141017 introduce razor

Template life cycle

1. コード部とマークアップ部に分解しつつ構文木を構築

2. コード部はそのまま、マークアップ部は Write メソッド呼び出し等に変換して .NET のコード ( 正確には CodeCompileUnit ) を生成 ( これが実行可能な class となる )

3. 2. の インスタンスを作成し、適宜プロパティを設定して実行する

Page 25: 20141017 introduce razor

コード部とマークアップ部に分離

@{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>}

Page 26: 20141017 introduce razor

@{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

コード部とマークアップ部に分離

Page 27: 20141017 introduce razor

class を構築 ( 実際には CodeDom.CodeCompileUnit)

public class __CompiledTemplate {

public void Execute() {var now = DateTime.Now;WriteLiteral(“ 今日は “ );Write(now.ToShortDateString());WriteLiteral (” です。 \r\n”);if (now.Hour < 12) {WriteLiteral(“<p> おはよう </p>”)} else if (21 <= now.Hour) { WriteLiteral(“ おやすみ” )}

}}

Page 28: 20141017 introduce razor

実行

• あとはインスタンス生成してプロパティ割り当てて実行するだけ。

• 実行には Razor 関わってない• .NET の VM に載る感じ• 速いんじゃないかな

Page 29: 20141017 introduce razor

まとめ

• ASP.NET の Template Engine であるところの Razor を紹介しました

• RazorEngine を使えば .NET アプリケーションでも簡単に利用できます

• CodeDom 面白そう

Page 30: 20141017 introduce razor

ちなみに、 yii (PHP) で Razor 構文っぽいノを使えるものある

らしい

• yii-razor-view-render• https

://code.google.com/p/yii-razor-view-render/

Page 31: 20141017 introduce razor

いじょー

2014/10/17 Template Engine Night

do_aki