ASP.NET MVCビューエンジンの比較


339

私は、ASP.NET MVCで利用できるさまざまなビューエンジンの内訳についてSOとGoogleを検索してきましたが、ビューエンジンとは何かについての簡単な高レベルの説明しか見つかりませんでした。

私は必ずしも「最高」または「最速」ではなく、さまざまな状況で主要なプレーヤー(たとえば、デフォルトのWebFormViewEngine、MvcContrib View Engineなど)の利点/欠点の実際の比較を探しているわけではありません。これは、既定のエンジンからの切り替えが特定のプロジェクトまたは開発グループにとって有利かどうかを判断するのに非常に役立つと思います。

誰かがそのような比較に遭遇しましたか?


43
「建設的ではない」という皮肉なことに、45,000回近く見てきた関係者に多くの価値を提供しています。コミュニティのニーズにもかかわらず、SOが自分のユーティリティを制限しているのは残念です。@ jeff-atwoodがそのように感じるとは思えません。
mckamey 2013年

回答:


430

ASP.NET MVCビューエンジン(コミュニティWiki)

包括的なリストが存在しないように見えるので、ここから始めましょう。これは、ASP.NET MVCコミュニティ(たとえば、これらのいずれかに貢献した人)が経験を追加した場合に非常に役立ちます。実装するものIViewEngine(たとえばVirtualPathProviderViewEngine)は、ここでは公平なゲームです。新しいビューエンジンをアルファベット順に並べて(WebFormViewEngineとRazorを上部に残して)、比較で客観的になるようにしてください。


System.Web.Mvc.WebFormViewEngine

設計目標:

Webフォームページを応答にレンダリングするために使用されるビューエンジン。

長所:

  • ASP.NET MVCに同梱されているため、ユビキタス
  • ASP.NET開発者にとって使い慣れた経験
  • IntelliSense
  • 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>
<%}%>

System.Web.Razor

設計目標:

長所:

  • コンパクトで表現力豊かで流動的な
  • 簡単に学べる
  • 新しい言語ではない
  • Intellisenseが優れている
  • ユニットテスト可能
  • ユビキタス、ASP.NET MVCに同梱

短所:

  • 上記の「タグスープ」とは少し異なる問題を作成します。サーバータグが実際にサーバーコードと非サーバーコードの周囲の構造を提供する場合、RazorはHTMLとサーバーコードを混同し、HTMLやJavaScriptを「エスケープ」する必要があるため、純粋なHTMLまたはJS開発を困難にします(詐欺の例#1を参照)。特定の非常に一般的な条件下でのタグ。
  • カプセル化と再利用性の低下:かみそりテンプレートを通常の方法のように呼び出すことは実際的ではありません。実際、かみそりはコードを呼び出すことはできますが、その逆はできません。これにより、コードとプレゼンテーションの混合が促進されます。
  • 構文は非常にHTML指向です。非HTMLコンテンツの生成は注意が必要です。これにもかかわらず、かみそりのデータモデルは基本的に単なる文字列連結であるため、VS.NETの設計時のヘルプによりこれは多少軽減されますが、構文エラーと入れ子エラーは静的にも動的にも検出されません。このため、保守性とリファクタリング性が低下する可能性があります。
  • 文書化されたAPIなしhttp://msdn.microsoft.com/en-us/library/system.web.razor.aspx

詐欺の例#1( "string [] ..."の配置に注意してください):

@{
    <h3>Team Members</h3> string[] teamMembers = {"Matt", "Joanne", "Robert"};
    foreach (var person in teamMembers)
    {
        <p>@person</p>
    }
}

ベルビュー

設計目標:

  • HTMLを「単なるテキスト」として扱うのではなく、ファーストクラスの言語として尊重してください。
  • HTMLをいじらないでください!データバインディングコード(Bellevueコード)はHTMLから分離する必要があります。
  • 厳密なモデルとビューの分離を実施する

手すり

設計目標:

BrailビューエンジンがMonoRailから移植され、Microsoft ASP.NET MVCフレームワークで動作するようになりました。Brailの概要については、CastleプロジェクトWebサイトのドキュメントを参照してください。

長所:

  • 「手首に優しい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

設計目標:

NDjangoは、FNET 言語を使用した.NETプラットフォーム上のDjangoテンプレート言語の実装 です

長所:


NHaml

設計目標:

Rails Hamlビューエンジンの.NETポート。Hamlウェブサイトから

Hamlは、インラインコードを使用せずに、任意のWebドキュメントのXHTMLを簡潔かつ簡潔に記述するために使用されるマークアップ言語です... Hamlは、実際にはXHTMLの抽象的な説明であるため、XHTMLをテンプレートに明示的にコーディングする必要がありません。 、動的コンテンツを生成するためのコードがいくつかあります。

長所:

  • 簡潔な構造(DRYなど)
  • うまくインデント
  • 明確な構造
  • C#Intellisense(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)

設計目標:

人気のJavaプロジェクトVelocityの .NETポートである NVelocityに基づくビューエンジン 。

長所:

  • 読み書きが簡単
  • 簡潔なビューコード

短所:

  • ビューで使用できるヘルパーメソッドの数が限られている
  • 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

設計目標:

SharpTilesは、JSTLの部分的なポートであり 、Tilesフレームワークの背後にあるコンセプトと組み合わされています(マイルストーン1以降)。

長所:

  • Java開発者になじみ深い
  • XMLスタイルのコードブロック

短所:

  • ...

例:

<c:if test="${not fn:empty(Page.Tiles)}">
  <p class="note">
    <fmt:message key="page.tilesSupport"/>
  </p>
</c:if>

Spark View Engine

設計目標:

アイデアは、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>

StringTemplateビューエンジンMVC

設計目標:

  • 軽量。ページクラスは作成されません。
  • 速い。テンプレートは、応答出力ストリームに書き込まれます。
  • キャッシュ。テンプレートはキャッシュされますが、FileSystemWatcherを使用してファイルの変更を検出します。
  • 動的。テンプレートは、その場でコードで生成できます。
  • フレキシブル。テンプレートは任意のレベルにネストできます。
  • MVCの原則に沿っています。UIとビジネスロジックの分離を促進します。すべてのデータは事前​​に作成され、テンプレートに渡されます。

長所:

  • StringTemplate Java開発者によく知られている

短所:

  • 単純なテンプレート構文は、意図した出力を妨害する可能性があります(例:jQueryの競合

ウィングビート

Wing BeatsはXHTMLを作成するための内部DSLです。これはF#に基づいており、ASP.NET MVCビューエンジンが含まれていますが、XHTMLを作成する機能のためだけに使用することもできます。

長所:

  • 有効なXMLのコンパイル時チェック
  • 構文の色分け
  • フルインテリセンス
  • コンパイルされたビュー
  • 通常のCLRクラス、関数などを使用した拡張性
  • 通常のF#コードであるため、シームレスな構成可能性と操作
  • ユニットテスト可能

短所:

  • 実際にHTMLを記述するのではなく、DSLでHTMLを表すコードを記述します。

XsltViewEngine(MvcContrib)

設計目標:

使い慣れたXSLTからビューを構築します

長所:

  • 広くユビキタス
  • XML開発者にとって使い慣れたテンプレート言語
  • XMLベース
  • 時の試練
  • 構文および要素のネストエラーは静的に検出できます。

短所:

  • 関数型言語スタイルはフロー制御を困難にします
  • XSLT 2.0は(おそらく?)サポートされていません。(XSLT 1.0はあまり実用的ではありません)。


9
@ BrianLy:F#はコンパイルされて機能するため、高速で、残りのランタイム(少なくともc#4まで)との相互運用性が高く、べき等です。私たちは最初にironpythonルートを下りましたが、結果に満足していませんでした。ネーミングに関しては-提案を
受け付け

7
Brailの短所セクションのため、投票は拒否されました。言語としてブーを持っていることは確かに不利ではありません。
オーウェン

48
@オーウェン:はい、そうです。これはC#開発者の視点から見る必要があります。テンプレートエンジンを使用するためだけに別の言語を学習する必要はありません。(当然、すでにBooを知っているなら、それはすばらしいことですが、C#開発者の大多数に
とって

5
かみそりはそこにあります。Razorをアルファベット順にするように更新する必要があります。
mckamey 2010

3
ブーはプロではなく、コンです。あなたはすでにC#の「外側」にいるので、テンプレートの簡潔さはより優れています。C#は「テンプレート化」のコンテキストで使用することを意図したものではなく、表現力豊かですが、「手首にやさしい」わけではありません。一方、BOOはそれを念頭に置いて作成されたため、テンプレートのコンテキストで使用するのに適しています。
Loudenvier、

17

私の現在の選択はかみそりです。非常にクリーンで読みやすく、ビューページの維持も非常に簡単です。本当に素晴らしいインテリセンスのサポートもあります。ALos、Webヘルパーと併用すると、非常に強力になります。

簡単なサンプルを提供するには:

@Model namespace.model
<!Doctype html>
<html>
<head>
<title>Test Razor</title>
</head>
<body>
<ul class="mainList">
@foreach(var x in ViewData.model)
{
<li>@x.PropertyName</li>
}
</ul>
</body>

そして、そこにあります。それはとてもきれいで読みやすいです。確かに、これは簡単な例ですが、複雑なページやフォームでも、非常に読みやすく、理解しやすくなっています。

短所は?これまでのところ(私はこれが初めてです)、フォームにいくつかのヘルパーを使用する場合、CSSクラス参照を追加するためのサポートが不足しており、少し面倒です。

ありがとうNathj07


1
どー!このディスカッションが古いことに気づきました。まあ、多分誰かがそれを見つけて、それはまだ役に立つことがわかるでしょう。
nathj07

10

これはあなたの質問に実際には答えませんが、ビューエンジンが異なると目的も異なります。スパークビューエンジン、例えば、目的はすべてが流暢かつ読みやすくしようとすることで、「タグのスープ」のご意見を取り除くします。

あなたの最善の策は、いくつかの実装を見ることです。ソリューションの意図に魅力があると思われる場合は、試してみてください。MVCでビューエンジンを混在させて一致させることができるため、特定のエンジンを使用しないことを決定しても問題にはなりません。


答えてくれてありがとう。「誰かがすでに要約をしなければならなかった」と考えたとき、私は文字通りあなたが提案したことを始めていました。これらの種類の設計目標と欠点のいくつかの集約を期待しています。「Spark View Engine ...は、すべてを流暢で読みやすいものにすることによって、「タグスープ」のビューを取り除くことを目的としています。」それはそれを構築する理由とデフォルトのビューエンジンの欠点を意味します。リストのもう1つの箇条書き。
mckamey 2009

7

このSharpDOMを確認してください。これは、htmlおよびasp.net mvcビューエンジンを生成するためのac#4.0内部dslです。


ビューを構築するための唯一の合理的な方法のように聞こえます。
Stephan Eggermont 2010

一般的なウィキの回答に追加できますか?
Mauricio Scheffer

CodePlexやGoogleではもう見つかりません。どこに行きましたか?(それはまだCodeprojectにあります:codeproject.com/Articles/667581/…
Jared Thirsk

5

私はンジャンゴが好きです。それは非常に使いやすく、非常に柔軟です。カスタムタグとフィルターを使用して、ビュー機能を簡単に拡張できます。「F#に大いに結びついている」というのは、デメリットよりもアドバンテージだと思います。


4

このリストには、各ビューエンジンのサンプルも含めて、ユーザーがすべてのWebサイトにアクセスしなくてもそれぞれの味を味わえるようにすべきだと思います。

写真は千の言葉を言い、マークアップのサンプルはビューエンジンのスクリーンショットのようなものです:)これが私のお気に入りのSpark View Engineのものです

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

4
冷たい融合のように見えます。私はこのようにコードをマークアップに混ぜるのはあまり好きではありません。メンテナンスが難しくなります。
アジャイルジェダイ2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.