Я оценивал различные механизмы просмотра, доступные для 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 поддерживает по умолчанию. Подробнее об этом будет следовать.
Свежие комментарии