ASP.NET MVC View Engine Comparison

Szukałem w SO & Google podziału różnych silników widoku dostępnych dla ASP.NET MVC, ale nie znalazłem wiele więcej niż proste opisy wysokiego poziomu, co to jest silnik widoku.

Niekoniecznie Szukam "najlepszego" lub "najszybszego", ale raczej prawdziwych porównań zalet / wad głównych graczy (np. domyślne Webformviewengine, Silniki widoku MvcContrib itp.) w różnych sytuacjach. Myślę, że byłoby to bardzo pomocne w określenie, czy przejście z domyślnego silnika byłoby korzystne dla danej grupy projektowej lub deweloperskiej.

Czy ktoś spotkał się z takim porównaniem?

Author: casperOne, 2009-09-20

6 answers

ASP.NET MVC View Engines (Community Wiki)

Ponieważ wyczerpująca lista nie wydaje się istnieć, zacznijmy od tego tutaj. Może to mieć wielką wartość dla ASP.NET społeczność MVC, jeśli ludzie dodają swoje doświadczenie (esp. każdy, kto przyczynił się do jednego z nich). Wszystko, co implementuje IViewEngine (np. VirtualPathProviderViewEngine), jest tutaj uczciwe. Wystarczy alfabetyzować nowe silniki widoku (pozostawiając WebFormViewEngine i Razor na górze) i starać się być obiektywnym w porównania.


System.Www.Mvc.WebFormViewEngine

Cele Projektu:

Silnik widoku, który służy do renderowania Strony formularzy internetowych do odpowiedzi.

Plusy:

  • wszechobecne, ponieważ statki z ASP.NET MVC
  • znajome doświadczenie dla ASP.NET deweloperzy
  • IntelliSense
  • może wybrać dowolny język z dostawcą CodeDom (np. C#, VB.NET, F#, Boo, Nemerle)
  • na żądanie compilation or precompiled views

Wady:

  • użycie jest mylone przez istnienie "klasycznego ASP.NET" wzorce, które nie mają już zastosowania w MVC (np. ViewState PostBack)
  • może przyczynić się do anty-wzorzec "tag soup"
  • składnia blokująca kod i silne wpisywanie mogą stać na drodze
  • IntelliSense wymusza styl nie zawsze odpowiedni dla bloków kodu inline
  • może być głośny przy projektowaniu prostych szablony

Przykład:

<%@ 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.Www.Razor

Cele Projektu:

Plusy:

  • zwarty, wyrazisty i płynny
  • Łatwy do nauczenia
  • nie jest nowym językiem
  • ma wielki Intellisense
  • Jednostka Testowalna
  • wszechobecne, statki z ASP.NET MVC

Wady:

  • tworzy nieco inny problem niż" tag soup", o którym mowa powyżej. Gdzie znaczniki serwera faktycznie zapewniają strukturę wokół kodu serwera i nie-serwera, Razor myli HTML i Kod serwera, co sprawia, że rozwój czystego HTML lub JS jest wyzwaniem (zobacz przykład Con #1), ponieważ musisz "uciec" znaczników HTML i / lub JavaScript pod pewnymi bardzo powszechnymi warunkami.
  • słaba enkapsulacja+reusability: niepraktyczne jest wywoływanie szablonu Razora tak, jakby była to normalna metoda - w praktyce razor może wywoływać kod, ale nie odwrotnie, co może zachęcać do mieszania kodu i prezentacja.
  • składnia jest bardzo zorientowana na html; generowanie treści innych niż html może być trudne. Pomimo tego, model danych Razora jest zasadniczo tylko połączeniem łańcuchów, więc błędy składni i zagnieżdżania nie są wykrywane ani statycznie, ani dynamicznie VS.NET pomoc w czasie projektowania łagodzi to nieco. Z tego powodu może ucierpieć Konserwacja i refaktoryzacja.
  • brak udokumentowanego API , http://msdn.microsoft.com/en-us/library/system.web.razor.aspx

Con przykład #1 (zwróć uwagę na umieszczenie " string []..."):

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

Bellevue

Cele projektu:

  • szanuj HTML jako język pierwszej klasy, w przeciwieństwie do traktowania go jako "tylko tekst".
  • nie zadzieraj z moim HTML! Kod powiązania danych (Kod Bellevue) powinien być oddzielony od HTML.
  • wymuszanie strict Model-View separacja

Brail

Cele Projektu:

Silnik Brail view został przeportowany od jednoszynowej do pracy z Microsoft ASP.NET Framework MVC. Na wprowadzenie do Brail, zobacz Dokumentacja projektu Zamku strona internetowa .

Plusy:

  • wzorowany na "przyjaznej dla nadgarstka składni Pythona"
  • widoki kompilowane na żądanie (ale bez prekompilacji dostępny)

Wady:

  • zaprojektowany do pisania w języku Boo

Przykład:

<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

Zastosowania Hasic VB.NET literały XML zamiast ciągów znaków, jak większość innych silników widoku.

Plusy:

  • sprawdzanie poprawnego XML w czasie kompilacji
  • kolorowanie składni
  • pełny intellisense
  • zestawione widoki
  • rozszerzalność za pomocą regularne klasy CLR, funkcje, itp
  • bezproblemowa kompozycja i manipulacja, ponieważ jest regularna VB.NET kod
  • Jednostka testowalna

Wady:

  • wydajność: buduje cały DOM przed wysłaniem go do klienta.

Przykład:

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

NDjango

Cele Projektu:

NDjango jest implementacją język szablonów Django na. Net platforma, za pomocą f # język.

Plusy:


NHaml

Cele Projektu:

. NET port rails Haml view engine. Z strony Haml :

Haml jest językiem znaczników, który jest używany aby czysto i prosto opisać XHTML dowolnego dokumentu internetowego, bez użycie kodu inline... Haml unika potrzeba jawnego kodowania XHTML do szablon, bo faktycznie jest streszczenie opisu XHTML, z kodem do generowania dynamicznych treść.

Plusy:

  • terse structure (tj. D. R. Y.)
  • dobrze wcięte
  • Wyczyść struktura
  • C # Intellisense (dla VS2008 bez ReSharper)

Wady:

    [ ... ], Zamiast wykorzystywać znajomość znaczników w XHTML [ ... ]]}
  • brak Intellisense dla VS2010

Przykład:

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

NVelocityViewEngine (MvcContrib)

Cele Projektu:

Silnik widoku oparty na NVelocity czyli port. NET z popularnej Javy projekt prędkość .

Plusy:

  • łatwy do odczytu / zapisu
  • zwięzły kod widoku

Wady:

  • ograniczona liczba metod pomocniczych dostępnych w widoku
  • Nie ma możliwości automatycznej integracji z Visual Studio (IntelliSense, sprawdzanie widoków w czasie kompilacji lub refaktoryzacja).]}

Przykład:

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

SharpTiles

Cele Projektu:

SharpTiles jest częściowym portem JSTL w połączeniu z koncepcją płytek framework (od Mile stone 1).

Plusy:

  • znane programistom Javy
  • bloki kodu w stylu XML

Wady:

  • ...

Przykład:

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

Spark View Engine

Cele Projektu:

Chodzi o to, aby html mógł zdominować przepływ i kod do dopasowania bezproblemowo.

Plusy:

  • tworzy bardziej czytelne szablony
  • C # Intellisense (dla VS2008 bez ReSharper)
  • W 2010 roku firma została założona w 2010 roku.]}
  • zapewnia potężną funkcję wiązania , aby pozbyć się całego kodu W twoich widokach i pozwala łatwo wymyślić własne znaczniki HTML

Wady:

  • brak wyraźnego oddzielenia w związku z tym, że nie jest to możliwe, nie jest to możliwe.]}

Przykład:

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

Cele Projektu:

  • lekki. Nie są tworzone żadne klasy strony.
  • Szybko. Szablony są zapisywane do strumienia wyjściowego odpowiedzi.
  • Cached. Szablony są buforowane, ale wykorzystują FileSystemWatcher do wykrywania zmiany w pliku.
  • dynamiczny. Szablony mogą być generowane w locie w kodzie.
  • Elastyczny. Szablony można zagnieżdżać na dowolnym poziomie.
  • zgodnie z zasadami MVC. Promuje oddzielenie interfejsu użytkownika od biznesu Logika. Wszystkie dane są tworzone przed czas, i przekazywane do szablonu.

Plusy:

  • znajomy dla programistów StringTemplate Java

Wady:

  • uproszczona składnia szablonu może zakłócać zamierzone wyjście (np. jQuery konflikt )

Wing Beats

Wing Beats jest wewnętrznym DSL do tworzenia XHTML. Opiera się na F# i zawiera ASP.NET MVC view engine, ale może być również wykorzystywany wyłącznie do tworzenia XHTML.

Plusy:

  • sprawdzanie poprawnego XML w czasie kompilacji
  • kolorowanie składni
  • pełny intellisense
  • zestawione widoki
  • rozszerzalność przy użyciu zwykłych klas CLR, funkcje, itp
  • bezproblemowe komponowanie i manipulowanie, ponieważ jest to zwykły kod F #
  • Jednostka testowalna

Wady:

  • tak naprawdę nie piszesz HTML, ale kod, który reprezentuje HTML w DSL.

XsltViewEngine (MvcContrib)

Cele Projektu:

Buduje widoki ze znanego XSLT

Plusy:

  • szeroko wszechobecne
  • znajomy język szablonów dla XML deweloperzy
  • oparte na XML
  • sprawdzony w czasie
  • błędy składni i zagnieżdżania elementów mogą być wykrywane statycznie.

Wady:

  • funkcjonalny styl języka utrudnia kontrolę przepływu
  • XSLT 2.0 jest (prawdopodobnie?) nie jest obsługiwana. (XSLT 1.0 jest znacznie mniej praktyczny).

 428
Author: mckamey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:26

Mój obecny wybór to Razor. Jest bardzo czysty i łatwy do odczytania i sprawia, że strony widoku są bardzo łatwe w utrzymaniu. Istnieje również wsparcie intellisense, które jest naprawdę świetne. ALos, gdy jest używany z Web helpers, jest też naprawdę potężny.

Aby podać prostą próbkę:

@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>
No i proszę. To jest bardzo czyste i łatwe do odczytania. Oczywiście, to prosty przykład, ale nawet na złożonych stronach i formularzach nadal jest bardzo łatwy do odczytania i zrozumienia. A co do minusów? Cóż, jak na razie (jestem w tym nowy) podczas korzystania z niektórych helperów dla formularzy brak jest wsparcia dla dodawania odniesienia do klasy CSS, co jest trochę irytujące.

Dzięki Nathj07

 18
Author: nathj07,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-13 19:21:15

Wiem, że to nie odpowiada na twoje pytanie, ale różne silniki widzenia mają różne cele. Na przykład silnik Spark View Engine ma na celu pozbycie się "zupy tagów", starając się, aby wszystko było płynne i czytelne.

Najlepiej byłoby spojrzeć na niektóre implementacje. Jeśli wygląda to atrakcyjnie dla intencji Twojego rozwiązania, wypróbuj je. Możesz mieszać i dopasowywać silniki widoku w MVC, więc nie powinno to być problemem, jeśli zdecydujesz się nie używać określonego silnik.

 11
Author: MunkiPhD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-20 15:49:23

Sprawdź to SharpDOM . Jest to wewnętrzny dsl C# 4.0 do generowania html, a także asp.net silnik widoku mvc.

 9
Author: Anton Shelin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-30 21:10:34

Lubię ndjango . Jest bardzo łatwy w użyciu i bardzo elastyczny. Możesz łatwo rozszerzyć funkcjonalność widoku za pomocą niestandardowych tagów i filtrów. Myślę, że "bardzo przywiązany do F#" jest raczej zaletą niż wadą.

 5
Author: rdovhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-25 19:48:57

Myślę, że ta lista powinna również zawierać próbki każdego silnika widoku, aby użytkownicy mogli uzyskać smak każdego z nich bez konieczności odwiedzania każdej strony internetowej.

Zdjęcia mówią tysiąc słów, a sample znaczników są jak zrzuty ekranu dla silników widoku:) więc oto jeden z moich ulubionych 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
Author: mythz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-12 21:01:48