[解決済み] ASP.NET MVC ビューエンジンの比較
質問
ASP.NET MVCで使用できる様々なビューエンジンの内訳をSO & Googleで検索していますが、ビューエンジンとは何かという簡単な高レベルの説明以上のものは見つかりません。
私は必ずしも "best" や "fastest" を求めているのではなく、様々な状況における主要なプレーヤー(デフォルトの WebFormViewEngine、MvcContrib View Engines など)の利点/欠点の実世界での比較を求めているのです。 これは、デフォルトエンジンからの切り替えが特定のプロジェクトや開発グループにとって有利であるかどうかを判断するのに非常に役立つと思います。
このような比較に出会ったことがある方はいらっしゃいますか?
解決方法は?
ASP.NET MVC ビューエンジン (コミュニティWiki)
包括的なリストは存在しないようなので、ここSOで始めましょう。これは、人々が彼らの経験を追加すれば、ASP.NET MVCコミュニティにとって大きな価値を持つことができます(特に、これらのいずれかに貢献した人たち)。 を実装しているものはすべて
IViewEngine
(例.
VirtualPathProviderViewEngine
は、ここではフェアなゲームです。 新しいビューエンジンをアルファベット順に並べ(WebFormViewEngineとRazorを一番上に残す)、客観的に比較するようにしましょう。
System.Web.Mvc.WebFormViewEngine
デザインの目標
をレンダリングするために使用されるビューエンジンです。 Web Formsのページをレスポンスに表示する。
長所
- ASP.NET MVCに同梱されているため、どこにでもある。
- ASP.NET開発者が慣れ親しんでいる
- インテリセンス
- CodeDom プロバイダーで任意の言語を選択可能(例:C#、VB.NET、F#、Boo、Nemerle)。
- オンデマンドコンパイルまたは プリコンパイル ビュー
短所
- MVCではもはや適用されないクラシックASP.NETパターンが存在するため、使い方が混乱する(例:ViewState PostBack)
- タグスープというアンチパターンを助長する可能性がある。
- コードブロック構文と強いタイピングが邪魔になることがある
- IntelliSenseは、インラインのコードブロックに必ずしも適切でないスタイルを強制的に適用する
- シンプルなテンプレートを設計する場合、ノイズになることがある
例
<%@ Control Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>" %>
<% if(model.Any()) { %>
<ul>
<% foreach(var p in model){%>
<li><%=p.Name%></li>
<%}%>
</ul>
<%}else{%>
<p>No products available</p>
<%}%>
デザインの目標
長所
- コンパクト、表現力、流動性
- 習得が容易
- 新しい言語ではない
- 優れたインテリセンス
- ユニットテスト可能
- ユビキタス、ASP.NET MVCに同梱。
短所
- 上記で言及した「タグスープ」とは少し異なる問題が発生します。サーバータグが実際にサーバーと非サーバーコードの構造を提供するのに対し、Razor は HTML とサーバーコードを混同し、純粋な HTML や JS の開発を困難にしています (Con Example #1 参照)。
- カプセル化+再利用性が悪い。razor のテンプレートを通常のメソッドのように呼び出すことは現実的ではありません。実際、razor はコードを呼び出すことはできますが、その逆はできません。
- 構文は非常にhtml指向で、html以外のコンテンツを生成するのは難しいかもしれません。 これにもかかわらず、razorのデータモデルは基本的に文字列の連結であるため、構文やネストのエラーは静的にも動的にも検出されません。 このため、保守性とリファクタビリティが損なわれる可能性があります。
- <ストライク ドキュメント化されたAPIがない , http://msdn.microsoft.com/en-us/library/system.web.razor.aspx
Con 例 1 ("string[]..." の配置に注目)。
@{
<h3>Team Members</h3> string[] teamMembers = {"Matt", "Joanne", "Robert"};
foreach (var person in teamMembers)
{
<p>@person</p>
}
}
デザインの目標
- HTMLを単なるテキストとして扱うのではなく、第一級の言語として尊重すること。
- 私のHTMLをいじらないで!」。データバインディングコード(ベルビューコード)は、HTMLとは別にする必要があります。
- モデル・ビューの分離を徹底する
デザインの目標
Brailのビューエンジンが移植されました。 MonoRailで動作するようになりました。 Microsoft ASP.NET MVC フレームワーク については Brailの紹介は のドキュメントを参照してください。 キャッスルプロジェクト ウェブサイト .
長所
- 手首に優しいPythonの構文に倣ったものです。
- オンデマンドのコンパイル済みビュー(ただし、プリコンパイルは不可)
短所
- 言語で記述されるように設計されている ブー
例
<html>
<head>
<title>${title}</title>
</head>
<body>
<p>The following items are in the list:</p>
<ul><%for element in list: output "<li>${element}</li>"%></ul>
<p>I hope that you would like Brail</p>
</body>
</html>
Hasicは、他の多くのビューエンジンのような文字列ではなく、VB.NETのXMLリテラルを使用しています。
長所
- 有効なXMLのコンパイル時チェック
- 構文による色分け
- 完全なインテリセンス
- コンパイルされたビュー
- 通常のCLRクラス、関数などを用いた拡張性
- 通常のVB.NETコードなので、シームレスな合成と操作が可能です。
- ユニットテスト可能
短所
- パフォーマンス クライアントに送信する前に DOM 全体を構築します。
例
Protected Overrides Function Body() As XElement
Return _
<body>
<h1>Hello, World</h1>
</body>
End Function
デザインの目標
NDjango は Django テンプレート言語 .NET上で プラットフォームで F#言語 .
長所
-
NDjangoリリース0.9.1.0は、ストレス下において、以下のものより安定しているようです。
WebFormViewEngine
- 構文カラー化、コード補完、as-you-type 診断を備えた Django テンプレートエディタ (VS2010 のみ)
- ASP.NET、Castle MonoRail、Bistro MVCフレームワークと統合されています。
デザインの目標
RailsのHamlビューエンジンを.NETに移植したもの。 から ハムルサイト :
Hamlはマークアップ言語であり、以下のような用途に使われます。 をきれいに、シンプルに記述します。 あらゆるWebドキュメントのXHTMLに対応し、かつ インライン・コードの使用... ハムルでは XHTMLを明示的にコーディングする必要はありません。 というのも、テンプレートは実際には XHTMLを抽象的に記述したものです。 を生成するためのいくつかのコードと のコンテンツになります。
長所
- 簡潔な構造(例:D.R.Y.)
- インデントが良い
- 明確な構造
- C# インテリセンス (ReSharperを使用しないVS2008の場合)
短所
- マークアップに精通していることを利用するのではなく、XHTMLを抽象化したもの。
- VS2010のIntellisenseはありません。
例
@type=IEnumerable<Product>
- if(model.Any())
%ul
- foreach (var p in model)
%li= p.Name
- else
%p No products available
NVelocityViewEngine (MvcContrib)
デザインの目標
をベースとしたビューエンジンです。 NVelocity を.NETに移植したものです。 人気のあるJavaプロジェクトの ベロシティ .
長所
- 読みやすい・書きやすい
- 簡潔なビューコード
短所
- ビューで使用できるヘルパーメソッドの数が限られています。
- Visual Studioとの統合(IntelliSense、ビューのコンパイル時チェック、リファクタリング)が自動的に行われない。
例
#foreach ($p in $viewdata.Model)
#beforeall
<ul>
#each
<li>$p.Name</li>
#afterall
</ul>
#nodata
<p>No products available</p>
#end
デザインの目標
SharpTilesは、以下のものを部分的に移植したものです。 JSTL の背後にあるコンセプトと組み合わせたものです。 タイル フレームワーク (マイルストーン1時点)。
長所
- Java開発者に親しまれている
- XMLスタイルのコードブロック
短所
- ...
例
<c:if test="${not fn:empty(Page.Tiles)}">
<p class="note">
<fmt:message key="page.tilesSupport"/>
</p>
</c:if>
デザインの目標
このアイデアは、htmlが フローを支配し、コードが収まるように シームレスになります。
長所
- より読みやすいテンプレートが作成できる
- C# インテリセンス (ReSharperを使用しないVS2008の場合)
- SparkSenseプラグイン VS2010用 (ReSharperと連動)
- 強力な バインディング機能 を取り除くために すべて のコードを使用し、独自のHTMLタグを簡単に作成することができます。
短所
- テンプレートロジックとリテラルマークアップを明確に分離できない(これは名前空間プレフィックスで緩和できる)。
例
<viewdata products="IEnumerable[[Product]]"/>
<ul if="products.Any()">
<li each="var p in products">${p.Name}</li>
</ul>
<else>
<p>No products available</p>
</else>
<Form style="background-color:olive;">
<Label For="username" />
<TextBox For="username" />
<ValidationMessage For="username" Message="Please type a valid username." />
</Form>
設計の目標
- 軽量であること。ページクラスが作成されない。
- 高速です。テンプレートはResponse Outputストリームに書き込まれます。
- キャッシュされる。テンプレートはキャッシュされるが、FileSystemWatcherを使用して、以下のことを検出する。 ファイルの変更。
- 動的。テンプレートはコード内でオンザフライで生成することができます。
- 柔軟性がある。テンプレートは任意のレベルまでネストすることができます。
- MVCの原則に沿う。UIとビジネスの分離を促進する。 ロジック。すべてのデータは先に作成されます。 テンプレートに渡されます。
長所
- StringTemplateのJava開発者に馴染み深い。
短所
- 単純化されたテンプレート構文が、意図した出力を妨げることがあります (例. jQueryの競合 )
Wing Beatsは、XHTMLを作成するための内部DSLです。F#をベースにしており、ASP.NET MVCのビューエンジンを含んでいますが、XHTMLを作成する機能だけを利用することもできます。
長所
- 有効なXMLのコンパイル時チェック
- 構文による色分け
- 完全なインテリセンス
- コンパイルされたビュー
- 通常のCLRクラス、関数などを用いた拡張性
- 通常のF#コードであるため、シームレスな合成と操作性
- ユニットテスト可能
短所
- HTMLを書くのではなく、HTMLをDSLで表現するコードを書くことになる。
デザインの目標
使い慣れたXSLTからビューを構築
長所
- ユビキタス
- XML開発者に親しまれているテンプレート言語
- XMLベース
- タイムテスト済み
- 構文エラーや要素のネストエラーを静的に検出することができます。
短所
- 関数型言語スタイルのため、フロー制御が難しい
- XSLT 2.0は(おそらく?)サポートされていません。 (XSLT 1.0はもっと実用的でない)。
関連
-
[解決済み] ファイルアップロード ASP.NET MVC 3.0
-
[解決済み] ASP.NET MVC Frameworkで複数のサブミットボタンを処理する方法は?
-
[解決済み] ASP.NET MVCでenumからドロップダウンリストを作成するにはどうすればよいですか?
-
[解決済み] ASP.NET MVC - カスタムIIdentityまたはIPrincipalの設定
-
[解決済み] razor viewエンジンでの@文字のエスケープ
-
[解決済み] ASP.NET MVCでビューをコンパイルする
-
[解決済み] ASP.NET MVCのビューを文字列としてレンダリングする方法は?
-
[解決済み】部分ビューから特定のセクションにコンテンツを注入する ASP.NET MVC 3 with Razor View Engine
-
[解決済み] [Solved] Replace line break characters with <br /> in ASP.NET MVC Razor view
-
[解決済み】HTTPエラー500.19とエラーコード: 0x80070021
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JsonResultが特殊文字(apostrophe)を \u0027 としてパースしています。
-
[解決済み] 既存のデータベースの選択されたテーブルからDbContextをScaffoldすることができますか[重複]。
-
[解決済み】ASP.NET MVC 3 razor ViewStart ファイルで異なるレイアウトを指定するには?
-
[解決済み] ASP.NET MVCでリクエストスロットルを実装するための最良の方法は?
-
[解決済み】ASP.NET MVC Html.ValidationSummary(true) でモデルエラーが表示されない。
-
[解決済み】HTTPエラー500.19とエラーコード: 0x80070021
-
[解決済み] asp.net mvc: なぜ Html.CheckBox は追加の隠された入力を生成するのですか?
-
[解決済み] MVCのHTMLヘルパーで生成されたHTML要素にclass属性を追加するにはどうすればよいですか?
-
[解決済み] ASP.NET MVCコントローラから外部URIへのリダイレクト
-
[解決済み] HTMLヘルパーでURLを生成する