20141017 introduce razor

Post on 29-Nov-2014

373 views 0 download

description

2014/10/17 Template Engine Night

transcript

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

header@RenderBodyfooter

@{Layout = “layout”;

}body

layout.cshtml

body.cshtml

headerbodyfooter

どうやって使う?

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

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

layout in RazorEnginevar 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# 力が足りない

先人の知恵を借りた

Template life cycle

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

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

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

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

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

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

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

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(“ おやすみ” )}

}}

実行

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

• 実行には 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