1. ホーム
  2. asp.net-mvc

[解決済み] ASP.NET MVC ビューエンジンの比較

2022-03-17 16:12:41

質問

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


システム.Web.Razor

デザインの目標

長所

  • コンパクト、表現力、流動性
  • 習得が容易
  • 新しい言語ではない
  • 優れたインテリセンス
  • ユニットテスト可能
  • ユビキタス、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

デザインの目標

NDjango は Django テンプレート言語 .NET上で プラットフォームで F#言語 .

長所


NHaml

デザインの目標

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が フローを支配し、コードが収まるように シームレスになります。

長所

短所

  • テンプレートロジックとリテラルマークアップを明確に分離できない(これは名前空間プレフィックスで緩和できる)。

<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

設計の目標

  • 軽量であること。ページクラスが作成されない。
  • 高速です。テンプレートはResponse Outputストリームに書き込まれます。
  • キャッシュされる。テンプレートはキャッシュされるが、FileSystemWatcherを使用して、以下のことを検出する。 ファイルの変更。
  • 動的。テンプレートはコード内でオンザフライで生成することができます。
  • 柔軟性がある。テンプレートは任意のレベルまでネストすることができます。
  • MVCの原則に沿う。UIとビジネスの分離を促進する。 ロジック。すべてのデータは先に作成されます。 テンプレートに渡されます。

長所

  • StringTemplateのJava開発者に馴染み深い。

短所

  • 単純化されたテンプレート構文が、意図した出力を妨げることがあります (例. jQueryの競合 )

ウィングビート

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

長所

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

短所

  • HTMLを書くのではなく、HTMLをDSLで表現するコードを書くことになる。

XsltViewEngine (MvcContrib)

デザインの目標

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

長所

  • ユビキタス
  • XML開発者に親しまれているテンプレート言語
  • XMLベース
  • タイムテスト済み
  • 構文エラーや要素のネストエラーを静的に検出することができます。

短所

  • 関数型言語スタイルのため、フロー制御が難しい
  • XSLT 2.0は(おそらく?)サポートされていません。 (XSLT 1.0はもっと実用的でない)。