ASP.NET MVC View Engine Сравнение - PullRequest
       56

ASP.NET MVC View Engine Сравнение

336 голосов
/ 20 сентября 2009

Я искал в SO & Google информацию о различных движках представления, доступных для ASP.NET MVC, но не нашел намного больше, чем простые высокоуровневые описания того, что такое движок представления.

Я не обязательно ищу "лучших" или "самых быстрых", а скорее некоторые сравнения реальных преимуществ / недостатков основных игроков (например, стандартный WebFormViewEngine, MvcContrib View Engines и т. Д.) Для различных ситуаций. Я думаю, что это было бы действительно полезно для определения того, будет ли переключение с движка по умолчанию выгодным для данного проекта или группы разработчиков.

Кто-нибудь сталкивался с таким сравнением?

Ответы [ 6 ]

429 голосов
/ 20 сентября 2009

ASP.NET MVC View Engines (Wiki сообщества)

Поскольку полный список, похоже, не существует, давайте начнем его здесь, на SO. Это может иметь большое значение для сообщества ASP.NET MVC, если люди добавят свой опыт (особенно любой, кто участвовал в одном из них) Все, что реализует IViewEngine (например, VirtualPathProviderViewEngine), является честной игрой здесь. Просто расположите в алфавитном порядке новые View Engine (оставив WebFormViewEngine и Razor наверху) и попытайтесь быть объективными в сравнении.


System.Web.Mvc.WebFormViewEngine

Цели проектирования:

Движок представления, используемый для визуализации Страница веб-форм к ответу.

Плюсы:

  • вездесущий, так как поставляется с ASP.NET MVC
  • знакомый опыт для разработчиков ASP.NET
  • IntelliSense
  • может выбрать любой язык у провайдера CodeDom (например, C #, VB.NET, F #, Boo, Nemerle)
  • компиляция по требованию или предварительно скомпилированные просмотры

Минусы:

  • использование смущено существованием "классических шаблонов ASP.NET", которые больше не применяются в MVC (например, 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.NET MVC

Минусы:

  • Создает немного отличную проблему от "супа метки", упомянутого выше. В то время как серверные тэги фактически обеспечивают структуру вокруг серверного и несерверного кода, Razor смешивает HTML и серверный код, что усложняет разработку чистого HTML или JS (см. Пример примера 1), так как в конечном итоге вам приходится «избегать» HTML и / или JavaScript теги при определенных очень общих условиях.
  • Плохая инкапсуляция + возможность повторного использования: нецелесообразно вызывать шаблон бритвы, как если бы это был обычный метод - на практике бритва может вызывать код, но не наоборот, что может стимулировать смешивание кода и представления.
  • Синтаксис очень html-ориентирован; генерировать не HTML-контент может быть сложно. Несмотря на это, модель данных бритвы по сути является просто конкатенацией строк, поэтому ошибки синтаксиса и вложения не обнаруживаются статически и динамически, хотя время разработки VS.NET несколько смягчает эту проблему. Из-за этого могут пострадать ремонтопригодность и способность к рефакторингу.
  • Нет документированного API , http://msdn.microsoft.com/en-us/library/system.web.razor.aspx

Con Пример № 1 (обратите внимание на размещение строки "[] ..."):

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

Bellevue

Цели разработки:

  • Уважайте HTML как первоклассный язык, а не рассматривайте его как «просто текст».
  • Не связывайтесь с моим HTML! Код привязки данных (код Bellevue) должен быть отделен от HTML.
  • Обеспечить строгое разделение модели и вида

Brail

Цели проектирования:

Механизм просмотра Brail был портирован от MonoRail для работы с Microsoft ASP.NET MVC Framework. За введение в Брайль, см. документация по проекту Castle сайт .

Плюсы:

  • смоделировано по принципу "дружественного синтаксису 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

Hasic использует литералы XML VB.NET вместо строк, как большинство других движков представления.

Плюсы:

  • Проверка правильности XML во время компиляции
  • Синтаксическая раскраска
  • Полный смысл
  • Скомпилированные представления
  • Расширяемость с помощью обычных классов, функций и т. Д.
  • Бесшовная компоновка и манипулирование, поскольку это обычный код VB.NET
  • Тестируемый модуль

Минусы:

  • Производительность: строит весь DOM перед отправкой клиенту.
* +1183 * Пример:
Protected Overrides Function Body() As XElement
    Return _
    <body>
        <h1>Hello, World</h1>
    </body>
End Function

NDjango

Цели проектирования:

NDjango - это реализация Язык шаблонов Django в .NET платформа, используя язык F # .

Плюсы:


NHaml

Цели дизайна:

.NET-порт Rails Haml view engine. С веб-сайт Haml :

Haml - это язык разметки, который используется чисто и просто описать XHTML любого веб-документа, без использование встроенного кода ... Haml избегает необходимость явного кодирования XHTML в шаблон, потому что это на самом деле абстрактное описание XHTML, с некоторым кодом для генерации динамического содержание.

Плюсы:

  • краткая структура (т.е. D.R.Y.)
  • хорошо с отступом
  • прозрачная структура
  • C # Intellisense (для VS2008 без ReSharper)

Минусы:

  • абстракция от XHTML, а не знакомство с разметкой
  • Нет Intellisense для VS2010

Пример: * * 1 256

@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

Цели проектирования:

SharpTiles - это частичный порт JSTL в сочетании с концепцией плитки рамки (по состоянию на Мили камень 1).

Плюсы:

  • знакомо разработчикам Java
  • блоки кода в стиле XML

Минусы:

  • ...

Пример:

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

Двигатель Spark View

Цели дизайна:

Идея состоит в том, чтобы позволить html доминировать поток и код, чтобы соответствовать бесшовно.

Плюсы:

  • Создает более читаемые шаблоны
  • C # Intellisense (для VS2008 без ReSharper)
  • Плагин SparkSense для VS2010 (работает с ReSharper)
  • Предоставляет мощную функцию Привязки , позволяющую избавиться от всего кода в ваших представлениях, и позволяет легко изобретать собственные теги HTML

Минусы:

  • Нет четкого отделения логики шаблона от буквенной разметки (это можно уменьшить с помощью префиксов пространства имен)
* * 1 367 Пример: * +1368 *
<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

Цели дизайна:

  • Легкий. Классы страниц не создаются.
  • Быстро. Шаблоны записываются в поток вывода ответа.
  • Сохраненная копия. Шаблоны кэшируются, но используют FileSystemWatcher для обнаружения изменения файла.
  • Динамический. Шаблоны могут быть сгенерированы на лету в коде.
  • Flexible. Шаблоны могут быть вложены на любой уровень.
  • В соответствии с принципами MVC. Способствует разделению пользовательского интерфейса и бизнеса Логика. Все данные созданы раньше время и передается шаблону.

Плюсы:

  • знакомо разработчикам Java StringTemplate

Минусы:

  • Упрощенный синтаксис шаблона может помешать намеченному выводу (например, jQuery конфликт )

Удары крыльев

Wing Beats - это внутренний DSL для создания XHTML. Он основан на F # и включает в себя механизм просмотра ASP.NET MVC, но также может использоваться исключительно для возможности создания XHTML.

Плюсы:

  • Проверка правильного XML во время компиляции
  • Синтаксическая раскраска
  • Полный смысл
  • Скомпилированные представления
  • Расширяемость с помощью обычных CLR-классов, функций и т. Д.
  • Бесшовная компоновка и манипулирование, поскольку это обычный код F #
  • Тестируемый модуль

Минусы:

  • На самом деле вы пишете не HTML, а код, который представляет HTML в DSL.

XsltViewEngine (MvcContrib)

Цели проектирования:

Строит представления из знакомого XSLT

Плюсы:

  • широко вездесущий
  • знакомый язык шаблонов для разработчиков XML
  • XML на основе
  • проверенное время
  • Статически могут быть обнаружены ошибки синтаксиса и вложенности элементов.

Минусы:

  • функциональный стиль языка затрудняет управление потоком
  • XSLT 2.0 (возможно?) Не поддерживается. (XSLT 1.0 гораздо менее практичен).

17 голосов
/ 13 ноября 2011

Мой текущий выбор - Бритва. Он очень чистый и легкий для чтения, а страницы просмотра очень просты в обслуживании. Есть также поддержка intellisense, которая действительно хороша. ALos, при использовании с веб-помощниками он действительно очень мощный.

Чтобы предоставить простой образец:

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

И вот оно у тебя. Это очень чисто и легко читается. Конечно, это простой пример, но даже на сложных страницах и формах его все еще очень легко читать и понимать.

Что касается минусов? Что ж, пока (я новичок в этом) при использовании некоторых помощников для форм отсутствует поддержка добавления ссылки на класс CSS, что немного раздражает.

Спасибо Nathj07

10 голосов
/ 20 сентября 2009

Я знаю, что это на самом деле не отвечает на ваш вопрос, но разные View Engine имеют разные цели. Например, Spark View Engine направлен на то, чтобы избавить ваши взгляды от «супа-метки», пытаясь сделать все свободно и читабельно.

Лучше всего было бы просто взглянуть на некоторые реализации. Если это выглядит привлекательным для целей вашего решения, попробуйте его. Вы можете смешивать и сопоставлять механизмы представления в MVC, поэтому это не должно быть проблемой, если вы решите не использовать определенный механизм.

8 голосов
/ 01 мая 2010

Отметьте SharpDOM . Это внутренний dsl c # 4.0 для генерации html, а также механизм просмотра asp.net mvc.

5 голосов
/ 25 февраля 2010

Мне нравится ndjango . Он очень прост в использовании и очень гибкий. Вы можете легко расширить функциональность просмотра с помощью пользовательских тегов и фильтров. Я думаю, что «сильно привязанный к F #» является скорее преимуществом, чем недостатком.

4 голосов
/ 01 февраля 2010

Я думаю, что этот список должен также включать образцы каждого механизма представления, чтобы пользователи могли получить представление о каждом из них, не посещая каждый веб-сайт.

На рисунках написано, что тысячи слов, а образцы разметки похожи на скриншоты для движков представления :) Так вот один из моих любимых 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>
...