ASP.NET MVC Perbandingan Mesin Lihat


339

Saya telah mencari di SO & Google untuk rincian dari berbagai Mesin Pencari yang tersedia untuk ASP.NET MVC, tetapi belum menemukan lebih dari sekadar deskripsi tingkat tinggi sederhana tentang apa itu mesin pencari.

Saya tidak selalu mencari "terbaik" atau "tercepat" tetapi lebih tepatnya beberapa perbandingan dunia nyata keuntungan / kerugian dari pemain utama (misalnya WebFormViewEngine default, Mesin Lihat MvcContrib, dll) untuk berbagai situasi. Saya pikir ini akan sangat membantu dalam menentukan apakah beralih dari mesin default akan menguntungkan untuk proyek atau kelompok pengembangan tertentu.

Adakah yang mengalami perbandingan seperti itu?


43
Ironis bahwa itu "tidak konstruktif" namun telah memberikan banyak nilai kepada mereka yang terlibat yang telah melihatnya hampir 45 ribu kali. Sayang sekali bahwa SO membatasi utilitas mereka sendiri meskipun ada kebutuhan masyarakat. Saya ragu @ jeff-atwood akan merasa seperti itu.
mckamey

Jawaban:


430

ASP.NET MVC View Engine (Komunitas Wiki)

Karena daftar yang komprehensif tampaknya tidak ada, mari kita mulai satu di sini di SO. Ini bisa sangat bermanfaat bagi komunitas ASP.NET MVC jika orang menambahkan pengalaman mereka (khususnya siapa saja yang berkontribusi pada salah satunya). Implementasi apa pun IViewEngine(misalnya VirtualPathProviderViewEngine) adalah permainan yang adil di sini. Cukup abjad Lihat Mesin Baru (meninggalkan WebFormViewEngine dan Razor di atas), dan cobalah untuk bersikap objektif dalam perbandingan.


System.Web.Mvc.WebFormViewEngine

Tujuan Desain:

Mesin tampilan yang digunakan untuk merender halaman Formulir Web ke respons.

Pro:

  • di mana-mana karena ia dikirimkan bersama ASP.NET MVC
  • pengalaman yang biasa bagi pengembang ASP.NET
  • IntelliSense
  • dapat memilih bahasa apa pun dengan penyedia CodeDom (mis. C #, VB.NET, F #, Boo, Nemerle)
  • kompilasi berdasarkan permintaan atau tampilan yang dikompilasi

Cons:

  • penggunaan dikacaukan oleh adanya pola "ASP.NET klasik" yang tidak lagi berlaku di MVC (mis. ViewState PostBack)
  • dapat berkontribusi pada anti-pola "tag soup"
  • sintaksis kode-blok dan pengetikan kuat dapat menghalangi
  • IntelliSense memberlakukan gaya yang tidak selalu sesuai untuk blok kode inline
  • bisa berisik saat mendesain templat sederhana

Contoh:

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

Tujuan Desain:

Pro:

  • Kompak, Ekspresif, dan Cairan
  • Mudah untuk dipelajari
  • Bukan bahasa baru
  • Memiliki Intellisense yang luar biasa
  • Unit Dapat Diuji
  • Di mana-mana, dikirimkan bersama ASP.NET MVC

Cons:

  • Menciptakan masalah yang sedikit berbeda dari "tag soup" yang dirujuk di atas. Di mana tag server sebenarnya menyediakan struktur di sekitar kode server dan non-server, Razor membingungkan HTML dan kode server, membuat pengembangan HTML atau JS murni menjadi menantang (lihat Contoh Con # 1) karena Anda akhirnya harus "melarikan diri" HTML dan / atau JavaScript tag dalam kondisi tertentu yang sangat umum.
  • Enkapsulasi + reuseability yang buruk: Tidak praktis untuk memanggil template pisau cukur seolah-olah itu adalah metode yang normal - dalam prakteknya pisau cukur dapat memanggil kode tetapi tidak sebaliknya, yang dapat mendorong pencampuran kode dan presentasi.
  • Sintaksnya sangat berorientasi pada html; menghasilkan konten non-html bisa rumit. Meskipun demikian, model data pisau cukur pada dasarnya hanya penggabungan string, sehingga kesalahan sintaksis dan bersarang tidak terdeteksi secara statis maupun dinamis, meskipun waktu desain VS.NET membantu mengurangi hal ini. Kemampu-rawatan dan daya tahan dapat menderita karena hal ini.
  • Tidak ada API yang terdokumentasi , http://msdn.microsoft.com/en-us/library/system.web.razor.aspx

Contoh Con # 1 (perhatikan penempatan "string [] ..."):

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

Bellevue

Tujuan desain:

  • Hormati HTML sebagai bahasa kelas satu dan bukan memperlakukannya sebagai "hanya teks".
  • Jangan main-main dengan HTML saya! Kode pengikatan data (kode Bellevue) harus terpisah dari HTML.
  • Terapkan pemisahan Model-View yang ketat

Brail

Tujuan Desain:

Mesin tampilan Brail telah diporting dari MonoRail untuk bekerja dengan Microsoft ASP.NET MVC Framework. Untuk pengantar Brail, lihat dokumentasi di situs web proyek Castle .

Pro:

  • dimodelkan setelah "sintaksis python ramah-pergelangan tangan"
  • Tampilan kompilasi berdasarkan permintaan (tetapi tidak tersedia prakompilasi)

Cons:

  • dirancang untuk ditulis dalam bahasa Boo

Contoh:

<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 menggunakan VB.NET's XML literal alih-alih string seperti kebanyakan mesin view lainnya

Pro:

  • Pengecekan waktu kompilasi terhadap XML yang valid
  • Pewarnaan sintaks
  • Intellisense penuh
  • Tampilan yang dikompilasi
  • Ekstensibilitas menggunakan kelas CLR biasa, fungsi, dll
  • Kompabilitas dan manipulasi yang mulus karena merupakan kode VB.NET biasa
  • Unit dapat diuji

Cons:

  • Kinerja: Membangun seluruh DOM sebelum mengirimnya ke klien.

Contoh:

Protected Overrides Function Body() As XElement
    Return _
    <body>
        <h1>Hello, World</h1>
    </body>
End Function

NDjango

Tujuan Desain:

NDjango adalah implementasi Bahasa Template Django pada platform .NET, menggunakan bahasa F # .

Pro:


NHaml

Tujuan Desain:

.NET port dari Rails Haml view engine. Dari situs web Haml :

Haml adalah bahasa markup yang digunakan untuk membersihkan dan hanya menggambarkan XHTML dari dokumen web apa pun, tanpa menggunakan kode inline ... Haml menghindari perlunya mengode XHTML secara eksplisit ke dalam templat, karena itu sebenarnya merupakan deskripsi abstrak XHTML , dengan beberapa kode untuk menghasilkan konten dinamis.

Pro:

  • struktur singkat (yaitu KERING)
  • indentasi baik
  • struktur yang jelas
  • C # Intellisense (untuk VS2008 tanpa ReSharper)

Cons:

  • abstraksi dari XHTML daripada meningkatkan keakraban markup
  • Tidak ada Intellisense untuk VS2010

Contoh:

@type=IEnumerable<Product>
- if(model.Any())
  %ul
    - foreach (var p in model)
      %li= p.Name
- else
  %p No products available

NVelocityViewEngine (MvcContrib)

Tujuan Desain:

Sebuah mesin pandangan berdasarkan NVelocity yang merupakan pelabuhan NET yang populer proyek Java Velocity .

Pro:

  • mudah dibaca / ditulis
  • kode tampilan ringkas

Cons:

  • terbatasnya jumlah metode bantuan yang tersedia pada tampilan
  • tidak secara otomatis memiliki integrasi Visual Studio (IntelliSense, pemeriksaan waktu kompilasi pandangan, atau refactoring)

Contoh:

#foreach ($p in $viewdata.Model)
#beforeall
    <ul>
#each
    <li>$p.Name</li>
#afterall
    </ul>
#nodata 
    <p>No products available</p>
#end

SharpTiles

Tujuan Desain:

SharpTiles adalah port parsial JSTL dikombinasikan dengan konsep di balik kerangka Tiles (pada Mile stone 1).

Pro:

  • akrab bagi pengembang Java
  • Blok kode gaya XML

Cons:

  • ...

Contoh:

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

Spark View Engine

Tujuan Desain:

Idenya adalah untuk memungkinkan html mendominasi aliran dan kode agar sesuai dengan mulus.

Pro:

  • Menghasilkan lebih banyak templat yang dapat dibaca
  • C # Intellisense (untuk VS2008 tanpa ReSharper)
  • Plug-in SparkSense untuk VS2010 (bekerja dengan ReSharper)
  • Menyediakan fitur Bindings yang kuat untuk menyingkirkan semua kode dalam tampilan Anda dan memungkinkan Anda untuk dengan mudah menemukan tag HTML Anda sendiri

Cons:

  • Tidak ada pemisahan yang jelas dari logika template dari markup literal (ini dapat dikurangi dengan awalan namespace)

Contoh:

<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 Lihat Engine MVC

Tujuan Desain:

  • Ringan Tidak ada kelas halaman yang dibuat.
  • Cepat. Template ditulis ke aliran Output Response.
  • Dalam cache Templat di-cache, tetapi gunakan FileSystemWatcher untuk mendeteksi perubahan file.
  • Dinamis. Template dapat dihasilkan dengan kode sambil jalan.
  • Fleksibel. Template dapat disarangkan ke level apa pun.
  • Sejalan dengan prinsip-prinsip MVC. Mempromosikan pemisahan UI dan Logika Bisnis. Semua data dibuat sebelumnya, dan diteruskan ke templat.

Pro:

  • akrab bagi pengembang Java StringTemplate

Cons:

  • sintaksis template sederhana dapat mengganggu output yang diinginkan (mis. konflik jQuery )

Ketukan sayap

Wing Beats adalah DSL internal untuk membuat XHTML. Ini didasarkan pada F # dan termasuk mesin view ASP.NET MVC, tetapi juga dapat digunakan semata-mata karena kemampuannya menciptakan XHTML.

Pro:

  • Pengecekan waktu kompilasi terhadap XML yang valid
  • Pewarnaan sintaks
  • Intellisense penuh
  • Tampilan yang dikompilasi
  • Ekstensibilitas menggunakan kelas CLR biasa, fungsi, dll
  • Kompabilitas dan manipulasi yang mulus karena merupakan kode F # biasa
  • Unit dapat diuji

Cons:

  • Anda tidak benar-benar menulis HTML tetapi kode yang mewakili HTML dalam DSL.

XsltViewEngine (MvcContrib)

Tujuan Desain:

Membangun tampilan dari XSLT yang sudah dikenal

Pro:

  • secara luas di mana-mana
  • bahasa template yang dikenal untuk pengembang XML
  • Berbasis XML
  • teruji waktu
  • Sintaks dan kesalahan elemen bersarang dapat dideteksi secara statis.

Cons:

  • gaya bahasa fungsional membuat kontrol aliran menjadi sulit
  • XSLT 2.0 tidak (mungkin?) Tidak didukung. (XSLT 1.0 jauh lebih tidak praktis).


9
@ BrianLy: karena F # dikompilasi dan fungsional, yang berarti cepat, lebih dapat dioperasikan dengan sisa runtime (setidaknya sampai c # 4), dan idempoten. kami pergi pada rute ironpython pada awalnya, tetapi tidak senang dengan hasilnya. sejauh penamaan - kami terbuka untuk saran :)
Kolosy

7
Voting turun karena bagian Kontra dari Brail. Memiliki Boo sebagai bahasa tentu bukan penipu.
Owen

48
@Wenen: Ya itu. Anda harus melihat ini dari perspektif pengembang C #. Anda tidak ingin belajar bahasa lain hanya dengan menggunakan mesin templating. (tentu saja jika Anda sudah tahu Boo, itu keren, tetapi untuk sebagian besar pengembang C #, ini merupakan rintangan tambahan untuk diatasi)
Christian Klauser

5
Pisau cukur ada di sana. Itu harus diperbarui untuk abjad Razor.
mckamey

3
Boo adalah Pro, bukan Con. Anda sudah "di luar" C #, yang terser template dapat menjadi lebih baik. C # tidak dimaksudkan untuk digunakan dalam konteks "templating", itu agak ekspresif tetapi tidak "ramah pergelangan tangan". Di sisi lain, BOO diciptakan dengan pemikiran itu dan karenanya lebih cocok untuk digunakan dalam konteks templating.
Loudenvier

17

Pilihan saya saat ini adalah Razor. Ini sangat bersih dan mudah dibaca dan menjaga halaman tampilan sangat mudah dipelihara. Ada juga dukungan intellisense yang sangat hebat. Juga, ketika digunakan dengan web helper, itu juga sangat kuat.

Untuk memberikan sampel sederhana:

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

Dan begitulah. Itu sangat bersih dan mudah dibaca. Memang, itu adalah contoh sederhana tetapi bahkan pada halaman dan formulir yang kompleks masih sangat mudah dibaca dan dipahami.

Adapun kontra? Sejauh ini (saya baru mengenal hal ini) ketika menggunakan beberapa helper untuk formulir ada kurangnya dukungan untuk menambahkan referensi kelas CSS yang sedikit mengganggu.

Terima kasih Nathj07


1
Doh! Hanya perhatikan berapa umur diskusi ini. Oh well, mungkin seseorang akan menemukannya dan itu masih terbukti bermanfaat.
nathj07

10

Saya tahu ini tidak benar-benar menjawab pertanyaan Anda, tetapi Mesin Pandang yang berbeda memiliki tujuan yang berbeda. Mesin Spark View , misalnya, bertujuan untuk menghilangkan pandangan Anda tentang "sup tag" dengan mencoba membuat semuanya lancar dan mudah dibaca.

Taruhan terbaik Anda adalah dengan melihat beberapa implementasi. Jika terlihat menarik untuk maksud solusi Anda, cobalah. Anda dapat mencampur dan mencocokkan mesin tampilan di MVC, jadi itu seharusnya tidak menjadi masalah jika Anda memutuskan untuk tidak pergi dengan mesin tertentu.


Terima kasih atas jawabannya. Saya benar-benar memulai apa yang Anda sarankan ketika saya pikir "seseorang harus sudah membuat ringkasan." Saya berharap untuk beberapa jenis tujuan desain dan kekurangan. "Mesin Spark View ... bertujuan untuk menghilangkan pandangan Anda tentang" sup tag "dengan mencoba membuat semuanya lancar dan mudah dibaca." Itu menyiratkan alasan untuk membangunnya serta kekurangan mesin tampilan default. Satu peluru lagi dalam daftar.
mckamey


5

Saya suka ndjango . Sangat mudah digunakan dan sangat fleksibel. Anda dapat dengan mudah memperluas fungsionalitas tampilan dengan tag dan filter khusus. Saya pikir "sangat terikat dengan F #" lebih menguntungkan daripada merugikan.


4

Saya pikir daftar ini juga harus menyertakan sampel masing-masing mesin tampilan sehingga pengguna dapat merasakan masing-masing tanpa harus mengunjungi setiap situs web.

Gambar mengatakan seribu kata dan sampel markup seperti screenshot untuk mesin tampilan :) Jadi, ini satu dari Spark View Engine favorit saya

<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
terlihat terlalu mirip coldfusion. Saya bukan penggemar berat pencampuran kode ke markup seperti ini. Menjadi sulit dipertahankan.
Agile Jedi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.