ASP.NET MVC View Engine So sánh


339

Tôi đã tìm kiếm trên SO & Google để tìm hiểu thêm về các Công cụ xem khác nhau có sẵn cho ASP.NET MVC, nhưng không tìm thấy nhiều hơn các mô tả cấp cao đơn giản về công cụ xem là gì.

Tôi không nhất thiết phải tìm kiếm "tốt nhất" hoặc "nhanh nhất" mà là một số so sánh thế giới thực về ưu điểm / nhược điểm của những người chơi chính (ví dụ: WebFormViewEngine mặc định, MvcContrib View Engines, v.v.) cho các tình huống khác nhau. Tôi nghĩ rằng điều này sẽ thực sự hữu ích trong việc xác định xem việc chuyển đổi từ công cụ mặc định có thuận lợi cho một dự án hoặc nhóm phát triển nhất định hay không.

Có ai gặp phải một so sánh như vậy?


43
Trớ trêu rằng nó "không mang tính xây dựng" nhưng đã cung cấp rất nhiều giá trị cho những người liên quan đã xem nó gần 45 nghìn lần. Thật tệ là SO đang hạn chế tiện ích của chính họ bất chấp nhu cầu của cộng đồng. Tôi nghi ngờ @ jeff-atwood sẽ cảm thấy như vậy.
mckamey

Câu trả lời:


430

Công cụ xem ASP.NET MVC (Cộng đồng Wiki)

Vì một danh sách toàn diện dường như không tồn tại, hãy bắt đầu một danh sách ở đây trên SO. Điều này có thể có giá trị lớn đối với cộng đồng ASP.NET MVC nếu mọi người thêm kinh nghiệm của họ (đặc biệt là bất kỳ ai đã đóng góp cho một trong số này). Bất cứ điều gì thực hiện IViewEngine(ví dụ VirtualPathProviderViewEngine) là trò chơi công bằng ở đây. Chỉ cần sắp xếp theo thứ tự bảng chữ cái Công cụ xem mới (để WebFormViewEngine và Dao cạo ở trên cùng) và cố gắng trở thành mục tiêu so sánh.


System.Web.Mvc.WebFormViewEngine

Mục tiêu thiết kế:

Công cụ xem được sử dụng để hiển thị trang Web Forms để phản hồi.

Ưu điểm:

  • có mặt khắp nơi vì nó xuất xưởng với ASP.NET MVC
  • kinh nghiệm quen thuộc cho các nhà phát triển ASP.NET
  • IntelliSense
  • có thể chọn bất kỳ ngôn ngữ nào với nhà cung cấp CodeDom (ví dụ: C #, VB.NET, F #, Boo, Nemerle)
  • biên soạn theo yêu cầu hoặc các khung nhìn được biên dịch trước

Nhược điểm:

  • việc sử dụng bị nhầm lẫn bởi sự tồn tại của các mẫu "ASP.NET cổ điển" không còn áp dụng trong MVC (ví dụ: ViewState PostBack)
  • có thể góp phần chống mô hình "canh thẻ"
  • Cú pháp khối mã và gõ mạnh có thể cản trở
  • IntelliSense thi hành kiểu không phải lúc nào cũng phù hợp với các khối mã nội tuyến
  • có thể gây ồn ào khi thiết kế các mẫu đơn giản

Thí dụ:

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

Mục tiêu thiết kế:

Ưu điểm:

  • Nhỏ gọn, biểu cảm và chất lỏng
  • Dễ học
  • Không phải là một ngôn ngữ mới
  • Có Intellisense tuyệt vời
  • Đơn vị kiểm tra
  • Đặc biệt, xuất xưởng với ASP.NET MVC

Nhược điểm:

  • Tạo ra một vấn đề hơi khác với "súp tag" được tham chiếu ở trên. Trường hợp các thẻ máy chủ thực sự cung cấp cấu trúc xung quanh mã máy chủ và không phải máy chủ, Razor nhầm lẫn mã HTML và mã máy chủ, khiến việc phát triển HTML hoặc JS thuần túy trở nên khó khăn (xem Ví dụ số 1) khi bạn phải "thoát" HTML và / hoặc JavaScript thẻ trong một số điều kiện rất phổ biến.
  • Đóng gói kém + khả năng sử dụng lại: Việc gọi một mẫu dao cạo như thể đó là một phương pháp bình thường - trong thực tế, dao cạo có thể gọi mã nhưng ngược lại, có thể khuyến khích trộn mã và trình bày.
  • Cú pháp rất định hướng html; tạo nội dung không phải html có thể khó. Mặc dù vậy, mô hình dữ liệu của dao cạo về cơ bản chỉ là nối chuỗi, do đó lỗi cú pháp và lồng không được phát hiện tĩnh hoặc động, mặc dù thời gian thiết kế của VS.NET giúp giảm thiểu phần nào điều này. Khả năng bảo trì và tái cấu trúc có thể bị ảnh hưởng do điều này.
  • Không có tài liệu API , http://msdn.microsoft.com/en-us/l Library / system.web.razor.aspx

Ví dụ số 1 (chú ý vị trí của "chuỗi [] ..."):

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

Thành phố

Mục tiêu thiết kế:

  • Tôn trọng HTML là ngôn ngữ hạng nhất thay vì coi nó là "chỉ văn bản".
  • Đừng gây rối với HTML của tôi! Mã ràng buộc dữ liệu (mã Bellevue) phải tách biệt với HTML.
  • Thực thi tách biệt Model-View

Brail

Mục tiêu thiết kế:

Công cụ xem Brail đã được chuyển từ MonoRail để hoạt động với Microsoft ASP.NET MVC Framework. Để biết giới thiệu về Brail, xem tài liệu trên trang web của dự án Castle .

Ưu điểm:

  • được mô phỏng theo "cú pháp python thân thiện với cổ tay"
  • Lượt xem được biên dịch theo yêu cầu (nhưng không có tiền biên dịch)

Nhược điểm:

  • được thiết kế để được viết bằng ngôn ngữ Boo

Thí dụ:

<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 sử dụng các chữ XML của VB.NET thay vì các chuỗi như hầu hết các công cụ xem khác.

Ưu điểm:

  • Kiểm tra thời gian biên dịch XML hợp lệ
  • Tô màu cú pháp
  • Toàn bộ nội dung
  • Tổng hợp quan điểm
  • Khả năng mở rộng bằng cách sử dụng các lớp CLR thông thường, các hàm, v.v.
  • Khả năng kết hợp và thao tác liền mạch vì mã VB.NET thông thường
  • Đơn vị kiểm tra

Nhược điểm:

  • Hiệu suất: Xây dựng toàn bộ DOM trước khi gửi cho khách hàng.

Thí dụ:

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

NDjango

Mục tiêu thiết kế:

NDjango là một triển khai của Ngôn ngữ Mẫu Django trên nền tảng .NET, sử dụng ngôn ngữ F # .

Ưu điểm:


NHam

Mục tiêu thiết kế:

Cổng .NET của Rails Haml xem công cụ. Từ trang web của Haml :

Haml là ngôn ngữ đánh dấu được sử dụng để mô tả rõ ràng và đơn giản XHTML của bất kỳ tài liệu web nào, không sử dụng mã nội tuyến ... Haml tránh sự cần thiết phải mã hóa rõ ràng XHTML vào mẫu, bởi vì đây thực sự là một mô tả trừu tượng về XHTML , với một số mã để tạo nội dung động.

Ưu điểm:

  • cấu trúc terse (tức là DRY)
  • thụt lề tốt
  • cấu trúc rõ ràng
  • C # Intellisense (dành cho VS2008 không có ReSharper)

Nhược điểm:

  • sự trừu tượng hóa từ XHTML thay vì tận dụng sự quen thuộc của đánh dấu
  • Không có Intellisense cho VS2010

Thí dụ:

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

NVelocityViewEngine (MvcContrib)

Mục tiêu thiết kế:

Một công cụ xem dựa trên NVelocity là cổng .NET của Vận tốc dự án Java phổ biến .

Ưu điểm:

  • dễ đọc / viết
  • mã xem ngắn gọn

Nhược điểm:

  • số lượng hạn chế của các phương thức trợ giúp có sẵn trên màn hình
  • không tự động có tích hợp Visual Studio (IntelliSense, kiểm tra thời gian biên dịch hoặc tái cấu trúc)

Thí dụ:

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

SharpTiles

Mục tiêu thiết kế:

SharpTiles là một phần của JSTL kết hợp với khái niệm đằng sau khung Gạch (kể từ Mile đá 1).

Ưu điểm:

  • quen thuộc với các nhà phát triển Java
  • Các khối mã kiểu XML

Nhược điểm:

  • ...

Thí dụ:

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

Động cơ Spark View

Mục tiêu thiết kế:

Ý tưởng là cho phép html thống trị luồng và mã phù hợp liền mạch.

Ưu điểm:

  • Sản xuất các mẫu dễ đọc hơn
  • C # Intellisense (dành cho VS2008 không có ReSharper)
  • Trình cắm SparkSense cho VS2010 (hoạt động với ReSharper)
  • Cung cấp tính năng Bindings mạnh mẽ để loại bỏ tất cả mã trong chế độ xem của bạn và cho phép bạn dễ dàng phát minh ra các thẻ HTML của riêng mình

Nhược điểm:

  • Không tách biệt rõ ràng logic mẫu khỏi đánh dấu bằng chữ (điều này có thể được giảm thiểu bằng các tiền tố không gian tên)

Thí dụ:

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

Mục tiêu thiết kế:

  • Nhẹ. Không có lớp trang nào được tạo.
  • Nhanh. Mẫu được ghi vào luồng đầu ra phản hồi.
  • Lưu trữ. Các mẫu được lưu trữ, nhưng sử dụng FileSystemWatcher để phát hiện các thay đổi tệp.
  • Năng động. Mẫu có thể được tạo ra khi đang bay trong mã.
  • Linh hoạt. Mẫu có thể được lồng vào bất kỳ cấp độ.
  • Phù hợp với các nguyên tắc MVC. Thúc đẩy phân tách UI và Business Logic. Tất cả dữ liệu được tạo trước thời hạn và được truyền xuống mẫu.

Ưu điểm:

  • quen thuộc với các nhà phát triển Java StringTemplate

Nhược điểm:

  • Cú pháp khuôn mẫu đơn giản có thể can thiệp vào đầu ra dự định (ví dụ: xung đột jQuery )

Cánh đập

Wing Beats là một DSL nội bộ để tạo XHTML. Nó dựa trên F # và bao gồm một công cụ xem ASP.NET MVC, nhưng cũng chỉ có thể được sử dụng cho khả năng tạo XHTML của nó.

Ưu điểm:

  • Kiểm tra thời gian biên dịch XML hợp lệ
  • Tô màu cú pháp
  • Toàn bộ nội dung
  • Tổng hợp quan điểm
  • Khả năng mở rộng bằng cách sử dụng các lớp CLR thông thường, các hàm, v.v.
  • Khả năng kết hợp và thao tác liền mạch vì đó là mã F # thông thường
  • Đơn vị kiểm tra

Nhược điểm:

  • Bạn không thực sự viết HTML nhưng mã đại diện cho HTML trong DSL.

XsltViewEngine (MvcContrib)

Mục tiêu thiết kế:

Xây dựng các khung nhìn từ XSLT quen thuộc

Ưu điểm:

  • có mặt khắp nơi
  • ngôn ngữ mẫu quen thuộc cho các nhà phát triển XML
  • Dựa trên XML
  • thời gian thử nghiệm
  • Lỗi cú pháp và phần tử lồng có thể được phát hiện tĩnh.

Nhược điểm:

  • phong cách ngôn ngữ chức năng làm cho việc kiểm soát dòng chảy khó khăn
  • XSLT 2.0 không (có lẽ?) Không được hỗ trợ. (XSLT 1.0 ít thực tế hơn nhiều).


9
@ BrianLy: bởi vì F # được biên dịch và hoạt động, điều đó có nghĩa là nó nhanh, có thể tương tác nhiều hơn với phần còn lại của thời gian chạy (ít nhất là cho đến c # 4) và idempotent. ban đầu chúng tôi đã đi xuống tuyến trăn sắt, nhưng không hài lòng với kết quả. theo như cách đặt tên - chúng tôi sẵn sàng đề xuất :)
kolosy

7
Bỏ phiếu vì phần Nhược điểm của Brail. Có Boo là ngôn ngữ chắc chắn không phải là một kẻ lừa đảo.
Owen

48
@Owen: Đúng vậy. Bạn phải xem xét điều này từ quan điểm của một nhà phát triển C #. Bạn không muốn học một ngôn ngữ khác chỉ để sử dụng một công cụ tạo khuôn mẫu. (tự nhiên nếu bạn đã biết Boo, điều đó thật tuyệt, nhưng đối với phần lớn các nhà phát triển C #, đây là một trở ngại bổ sung để vượt qua)
Christian Klauser

5
Dao cạo đang ở trong đó. Nó nên được cập nhật để bảng chữ cái Dao cạo.
mckamey

3
Boo là một Pro, không phải là Con. Bạn đã "ở ngoài" C #, mẫu có thể trở nên tốt hơn. C # không có nghĩa là được sử dụng trong bối cảnh "tạo khuôn mẫu", nó có phần biểu cảm nhưng không "thân thiện với cổ tay". Mặt khác, BOO được tạo ra với ý nghĩ đó và do đó, nó cho vay tốt hơn nhiều để được sử dụng trong bối cảnh khuôn mẫu.
Lâu đài

17

Lựa chọn hiện tại của tôi là Dao cạo. Nó rất sạch sẽ và dễ đọc và giữ cho các trang xem rất dễ bảo trì. Ngoài ra còn có hỗ trợ intellisense thực sự tuyệt vời. ALos, khi được sử dụng với trình trợ giúp web, nó cũng thực sự mạnh mẽ.

Để cung cấp một mẫu đơn giản:

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

Và bạn có nó rồi đấy! Điều đó rất sạch sẽ và dễ đọc. Cấp, đó là một ví dụ đơn giản nhưng ngay cả trên các trang và hình thức phức tạp, nó vẫn rất dễ đọc và dễ hiểu.

Còn về khuyết điểm? Cho đến nay (tôi mới biết điều này) khi sử dụng một số trình trợ giúp cho các biểu mẫu, thiếu sự hỗ trợ để thêm một tham chiếu lớp CSS, điều này hơi khó chịu.

Cảm ơn Nathj07


1
Đừng! Chỉ cần chú ý cuộc thảo luận này bao nhiêu tuổi. Oh tốt, có thể ai đó sẽ tìm thấy nó và nó vẫn sẽ chứng minh hữu ích.
nathj07

10

Tôi biết điều này không thực sự trả lời câu hỏi của bạn, nhưng Công cụ xem khác nhau có mục đích khác nhau. Các Spark View Engine , ví dụ, mục đích để thoát khỏi quan điểm của bạn về "súp tag" bằng cách cố gắng làm cho mọi thứ trôi chảy và dễ đọc.

Đặt cược tốt nhất của bạn sẽ chỉ là nhìn vào một số triển khai. Nếu nó trông hấp dẫn với mục đích của giải pháp của bạn, hãy thử nó. Bạn có thể trộn và kết hợp các công cụ xem trong MVC, vì vậy nó không phải là vấn đề nếu bạn quyết định không đi với một công cụ cụ thể.


Cảm ơn câu trả lời. Tôi thực sự bắt đầu những gì bạn đề xuất khi tôi nghĩ rằng "ai đó đã phải thực hiện một bản tóm tắt rồi." Tôi hy vọng cho một số tổng hợp của các loại mục tiêu và thiếu sót thiết kế. "Công cụ Spark View ... nhằm mục đích loại bỏ quan điểm của bạn về" súp tag "bằng cách cố gắng làm cho mọi thứ trôi chảy và dễ đọc." Điều đó ngụ ý một lý do để xây dựng nó cũng như sự thiếu sót của công cụ xem mặc định. Thêm một viên đạn trong danh sách.
mckamey

7

Kiểm tra SharpDOM này . Đây là dsl nội bộ ac # 4.0 để tạo html và công cụ xem mvc asp.net.


Âm thanh như cách hợp lý duy nhất để xây dựng quan điểm.
Stephan Eggermont

bạn có thể thêm nó vào câu trả lời chung của wiki không?
Mauricio Scheffer

Tôi không thể tìm thấy nó trên CodePlex hoặc Google nữa. Nó đã đi đâu ?? (Vẫn còn trên Codeproject: codeproject.com/Articles/667581/ triệt )
Jared Thirsk

5

Tôi thích ndjango . Nó rất dễ sử dụng và rất linh hoạt. Bạn có thể dễ dàng mở rộng chức năng xem với các thẻ và bộ lọc tùy chỉnh. Tôi nghĩ rằng "rất gắn liền với F #" là lợi thế hơn là bất lợi.


4

Tôi nghĩ rằng danh sách này cũng nên bao gồm các mẫu của từng công cụ xem để người dùng có thể nhận được hương vị của từng loại mà không cần phải truy cập vào mỗi trang web.

Hình ảnh cho biết hàng ngàn từ và mẫu đánh dấu giống như ảnh chụp màn hình cho các công cụ xem :) Vì vậy, đây là một từ Spark Engine Engine yêu thích của tôi

<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
trông quá giống như lạnh lùng. Tôi không phải là một fan hâm mộ lớn của việc trộn mã vào đánh dấu như thế này. Nó trở nên khó khăn để duy trì.
Agedi Jedi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.