ASP.NET MVC や WebPages で大活躍の Razor ビューエンジン。 ASP.NET の一員ということで、 vNext のオープンソース化と共に GitHubでソースコードが公開されています。
この記事では、 Razor のクラスを自分で使う場合にわかる変化について紹介します。
Legacy
という今までの Razor を使ったプロジェクトと、 New
という ASP.NET Core からの Razor を使ったプロジェクトを用意し、比較します。ソースコード等はこちらから
名前空間の変更
NuGet からライブラリを用意する場合の Razor の識別名は、今も変わらず Microsoft.AspNet.Razor
です。
しかし、名前空間を見てみると、以前は System.Web.Razor
配下であるのに対し、 Core では Microsoft.AspNet.Razor
となっています。
GeneratedClassContext クラスのコンストラクタの変化
このクラスは、 RazorEngineHost
を使ってコード生成について設定する際、 GeneratedClassContext
プロパティ(名前が同じ)に指定するためのものです。
従来の場合、使用するメソッド名を指定する際は 3 つの名前だけを引数に取るオーバーロードがありました。
22 | var host = new RazorEngineHost(language) |
ASP.NET Core では、これをメソッド名を 3 つ指定する際には GeneratedTagHelperContext
クラスのインスタンスが新たに必要になりました。
25 | var host = new RazorEngineHost(language) |
プロパティを見る限りでは、タグの生成に関する設定をするためのもののようです。なぜこうしたのかは不明。
Razor が生成するオブジェクトがガラリと変わった
従来の場合、 RazorTemplateEngine#GenerateCode
メソッドは、その名前からのイメージと違い、コードの DOM を生成していました。そして、その DOM を使って文字列を出力するプログラムへとコンパイル、実行していました。
40 | // コードDOM生成 |
ASP.NET Core では、ソースコードそのものを文字列型で出力するようになりました。
45 | //ソースコード生成 |
Razor で生成されるメソッドが非同期に対応
従来は、生成されるクラス内で HTML などを出力するメソッドは void
型の Execute
でした。
1 | public abstract void Execute(); |
ASP.NET Core では、 Task
型の ExecuteAsync
になり、 async
/ await
で非同期処理ができるようになりました。
1 | public abstract Task ExecuteAsync(); |
おわりに
ASP.NET MVC から ‘.cshtml’ を Razor で変換するという、いつもの処理をする際には、今までとほとんど変わらない使用法になります。もし Razor を単体で使う場合には、今までの資料が役に立たない可能性があります。 そうした場合に参考になれば幸いです。