Поиск лучшего View Engine — ASP.NET MVC

Я оценивал различные механизмы просмотра, доступные для ASP.NET MVC. В моих последних двух постах я оценил Brail и, наконец, отклонил его, поскольку он не соответствовал тому, что я искал.

Напомню — я ищу движок представлений, который позволит веб-дизайнеру создавать представления от моего имени или, по крайней мере, тесно сотрудничать с разработчиками с точки зрения стиля и макета. Движок представления ASP.NET по умолчанию в этом отношении просто недостаточен — дизайн всегда был нацелен на разработчиков, а не дизайнеров. На более высоком уровне такие проекты, как MVC Contrib , усугубляют эту проблему. Не поймите меня неправильно — мне нравится MVC Contrib. Я просто подчеркиваю, что, в то время как мы облегчаем разработку для разработчиков, мы затрудняем работу дизайнеров с разработчиками.

Если вы мне не верите, попросите дизайнера оформить этот стол.

<%= Html.Grid(Model.People).Columns(column => {
             column.For(x => x.Id).Named("Person ID");
             column.For(x => x.Name);
             column.For(x => x.DateOfBirth).Format("{0:d}");
         })
        .Attributes(style => "width:100%")
         .Empty("There are no people.")
         .RowStart(row => "<tr foo='bar'>") %>

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

NHaml

NHaml является частью MVC Contrib и использует синтаксис Haml от Ruby.

#foo
    - foreach (var product in ViewData)
        - if (product.Category.CategoryName != null)
            %h2=product.Category.CategoryName
            - break
    %ul.productlist
        - foreach (var product in ViewData)
            %li
                = Html.Image("/Content/Images/" + product.ProductID + ".jpg", product.ProductName)
                .productdetail
                    =Html.ActionLink(product.ProductName, "Detail", new { ID=product.ProductID })
                    %br
                    Price:
                    =String.Format("{0:C2}", product.UnitPrice)
                        %span.editlink
                            (
                            =Html.ActionLink("Edit", "Edit", new { ID=product.ProductID })
                            )

Спасибо Скотту Хансельману за фрагмент. Ясно, что это не то, что я ищу.

искра

Я упомянул в Твиттере, что я оцениваю различные механизмы просмотра, и кто-то немедленно порекомендовал мне Spark . Я на самом деле вспомнил, что Фил Хаак писал об этом, поэтому я был довольно оптимистичен.

<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

Синтаксис, конечно, другой и очень удобный для html (девиз Spark «Html friendly — меньше значит больше»). Однако это все еще не то, что я ищу — хотя дизайнер нашел бы синтаксис достаточно знакомым, я убежден, что смешивание html с проверенным кодом таким образом не помогает нашему делу в этом отношении.

NVelocity

Мое первоначальное впечатление от NVelocity было очень позитивным. Похоже, для этого механизма представления информации очень мало, но пара примеров выглядела многообещающе. Вот как выглядит цикл foreach .

#foreach( $recipe in $viewdata )
    <li><a href="Edit/$recipe.ID">$recipe.Name</a></li>
#end

Что очень много, что я ищу. Тем не менее, взгляните на следующий фрагмент.

$HtmlHelper.LabelFor('elementid', 'Name:', "%{class='required', accessKey='N'}")

И мы вернулись на круги своя. Или еще хуже

#foreach($person in $people)
#beforeall
       <table>
               <tr>
               <th>Name</th>
               <th>Age</th>
               </tr>
#before
       <tr
#odd
       Style='color:gray'>
#even
       Style='color:white'>
#each
       <td>$person.Name</td>
       <td>$person.Age</td>
#after
       </tr>
#between
       <tr><td colspan='2'>$person.bio</td></tr>
#afterall
       </table>
#nodata
       Sorry No Person Found
#end

Наконец, ответ

Я полностью понимаю, почему большинство движков представления имеют сложный синтаксис — мы пытаемся дублировать функциональность из движка представления ASP.NET по умолчанию. Разработчик не собирается использовать движок представления, если он не может сделать все, что может встроенный, не так ли? Ну, не обязательно …

Коллега познакомил меня со Smarty , движком представления, разработанным, чтобы позволить разработчикам и дизайнерам работать вместе . Вот цикл foreach в Smarty.

<ul>
{foreach from=$myArray item=foo}
    <li>{$foo}</li>
{/foreach}
</ul>

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

Есть только одна серьезная проблема — это механизм просмотра php.

Пишу свой собственный движок

Я хотел поэкспериментировать и посмотреть, смогу ли я написать движок представления (для ASP.NET), который использует тот же синтаксис. Я нашел это удивительно простым в некоторых областях и удивительно трудным в других. У меня ушло около часа, чтобы я мог вынести оператор foreach (и еще один час, чтобы вывести вложенные операторы foreach ). Сложность заключается в структурировании кода и предоставлении различных видов функций (на данный момент вы также можете добавлять свои собственные функции).

Вот где я сейчас нахожусь — сначала я хочу немного лучше структурировать код и, по крайней мере, реализовать все функции, которые Smarty поддерживает по умолчанию. Подробнее об этом будет следовать.

Author: admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *