342

ASP.NET MVC で使用できるさまざまなビュー エンジンの内訳を SO と Google で検索してきましたが、ビュー エンジンとは何かについての簡単な概要説明以上のものは見つかりませんでした。

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

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

4

6 に答える 6

433

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

包括的なリストは存在しないように思われるので、ここでSOから始めましょう。これは、人々が経験を追加した場合(特に、これらのいずれかに貢献した人)、ASP.NETMVCコミュニティにとって大きな価値があります。実装するものIViewEngine(例VirtualPathProviderViewEngine)はすべて、ここでは公正なゲームです。新しいビューエンジンをアルファベット順に並べて(WebFormViewEngineとRazorを上部に残して)、比較の際に客観的になるようにしてください。


System.Web.Mvc.WebFormViewEngine

設計目標:

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

長所:

  • ASP.NETMVCに同梱されているためユビキタス
  • 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.NETMVCに同梱

短所:

  • 上記の「タグスープ」とは少し異なる問題が発生します。サーバータグが実際にサーバーコードと非サーバーコードの周りの構造を提供する場合、RazorはHTMLとサーバーコードを混同し、HTMLやJavaScriptを「エスケープ」する必要があるため、純粋なHTMLまたはJSの開発を困難にします(例1を参照)。特定の非常に一般的な条件下でのタグ。
  • カプセル化と再利用性の低さ:通常の方法であるかのようにかみそりのテンプレートを呼び出すことは実用的ではありません。実際には、かみそりはコードを呼び出すことができますが、その逆はできません。これにより、コードとプレゼンテーションの混合が促進される可能性があります。
  • 構文は非常にhtml指向です。HTML以外のコンテンツを生成するのは難しい場合があります。それにもかかわらず、razorのデータモデルは基本的に文字列の連結にすぎないため、構文とネストのエラーは静的にも動的にも検出されませんが、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を台無しにしないでください!データバインディングコード(ベルビューコード)は、HTMLとは別にする必要があります。
  • 厳密なモデルビューの分離を実施する

点字

設計目標:

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

長所:

  • 「手首に優しいPython構文」をモデルにしています
  • オンデマンドでコンパイルされたビュー(ただし、事前コンパイルは利用できません)

短所:

  • Boo言語で書かれるように設計されています

例:

<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

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は、 F#言語を使用した.NETプラットフォームでのDjangoテンプレート言語の実装です。

長所:


NHaml

設計目標:

RailsHamlビューエンジンの.NETポート。HamlのWebサイトから:

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とビジネスロジックの分離を促進します。すべてのデータは事前​​に作成され、テンプレートに渡されます。

長所:

  • StringTemplateJava開発者にはおなじみ

短所:

  • 単純なテンプレート構文は、意図した出力に干渉する可能性があります(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はそれほど実用的ではありません)。

于 2009-09-20T16:03:10.323 に答える
18

My current choice is Razor. It is very clean and easy to read and keeps the view pages very easy to maintain. There is also intellisense support which is really great. ALos, when used with web helpers it is really powerful too.

To provide a simple sample:

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

And there you have it. That is very clean and easy to read. Granted, that's a simple example but even on complex pages and forms it is still very easy to read and understand.

As for the cons? Well so far (I'm new to this) when using some of the helpers for forms there is a lack of support for adding a CSS class reference which is a little annoying.

Thanks Nathj07

于 2011-11-13T19:21:15.820 に答える
11

これがあなたの質問に実際に答えていないことはわかっていますが、異なるビュー エンジンには異なる目的があります。たとえば、Spark View Engine は、すべてを流暢で読みやすいものにしようとすることで、ビューから「タグスープ」を取り除くことを目指しています

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

于 2009-09-20T15:49:23.970 に答える
8

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

于 2010-04-30T21:10:34.910 に答える
6

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

于 2010-02-25T19:48:57.747 に答える
4

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

写真は百聞は一見に如かず、マークアップ サンプルはビュー エンジンのスクリーンショットのようなものです :) だから、これは私のお気に入りのSpark View Engineの 1 つです。

<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>
于 2010-02-01T17:51:11.403 に答える