Когда первый раз читал про Razor View Engine в блоге Скота Гатри и наткнулся вот на такое описание цикла foreach:
Первое, что пришло в голову: «Так это же почти как NHaml!». В этой статье попытаюсь сравнить насколько эти два движка близки по удобству программирования. Для этого создам два пустых проекта с названиями RazorMVCApplication и NHamlMVCApplication (предполагается, что NHaml установлен и настроен).
Пусть модель будет предоставлять данные из базы ViewEngines, которая находится на Microsoft SQL Server 2008 Express. В этой базе будет только одна таблица с таким же названием и вот такой схемой:
В виде данных используем информацию о существующих движках для MVC Framework:
Сгенерируем модель по этой базе данных с помощью LinqToSQL для обоих наших проектов.
На следующем шаге создадим HomeController. У нас автоматически сгенерируется метод Index(). Создадим для него View (теперь все действия мы совершаем для Razor). Так как у нас нет master page, не забудем снять галочку с Select master pag). Если мы запустим наше приложение, то увидим пустую страницу. Именно она соответствует коду, автоматически сгенерированному в нашем View.
Теперь попробуем отобразить заголовок окна, заданный в контроллере. Для этого в методе Index() добавим следующую строку перед return View():
ViewData["Title"] = "Hello, Razor!";
* This source code was highlighted with Source Code Highlighter.
А также немного изменим секцию title в представлении:
<title>@View.Title</title>
* This source code was highlighted with Source Code Highlighter.
Это все, что нам нужно сделать для того, чтобы изменить заголовок из контроллера.
Давайте сделаем то же самое для проекта с NHaml:
Поскольку наше представление должно лежать во View/Home/Index, то создадим каталог Home и добавим в него пустой текстовый файл с именем Index.haml. Запустив приложение убедимся, что открывается чистая страница.
Чтобы задать заголовок страницы, напишем следующее:
%html
%head
%title="My cool title"
%body
В этом можно увидеть некоторое преимущество NHaml: нет необходимости писать закрывающие теги, все определяется отступами. На мой взгляд в этом кроется и основной недостаток – если представление большое, то бывает проблематично уследить за количеством отступов.
Получим значение заголовка, заданного в контроллере:
%html
%head
%title= ViewData.Title
%body
Теперь вернемся к Razor и отобразим содержимое единственной таблицы базы данных.
В контроллере добавим:
using (var dc = new MVCApplicationDataContext())
{
ViewData["ViewEngines"] = (from engine
in dc.ViewEngines select engine).ToList();
}
Во View:
<ul>
@foreach(var engine in @View.ViewEngines) {
<li>@engine.Name</li> }
</ul>
Повторим то же самое и для NHaml:
%body
%ul
-foreach (var engine in ViewData.ViewEngines)
%li=engine.Name
Если в проекте есть куски представления, которые можно переиспользовать, то в Razor есть метод @Html.Partial(“PartialName”), который дает возможность вставить представление из другого файла. В NHaml для этого используются файлы с имененем, начинающимся с символа “_”. То есть, если мы хотим вставить представление из файла с именем _partialname, то напишем так:
%body
_partialname
%ul
-foreach (var engine in ViewData.ViewEngines)
%li=engine.Name
Большинство языковых конструкций очень похожи, и принцип их использования одинаков. Но тогда встает вопрос об удобствах, предоставляемых Visual Studio, ведь именно они буду определять решающую роль в скорости разработки. И тут в случае NHaml мы натыкаемся на такую ситуацию: intellisense в виде плагина есть только для VisualStudio 2008, когда будет для 2010 никто не знает. Есть утилита позволяющая подсвечивать код, но это помогает незначительно. Для Razor intellisense появится, скорее всего, вместе с релизом MVC 3.
Комментариев нет:
Отправить комментарий