воскресенье, 10 октября 2010 г.

MVC. Razor vs NHaml

Когда первый раз читал про Razor View Engine в блоге Скота Гатри и наткнулся вот на такое описание цикла foreach:

clip_image002

Первое, что пришло в голову: «Так это же почти как NHaml!». В этой статье попытаюсь сравнить насколько эти два движка близки по удобству программирования. Для этого создам два пустых проекта с названиями RazorMVCApplication и NHamlMVCApplication (предполагается, что NHaml установлен и настроен).

Пусть модель будет предоставлять данные из базы ViewEngines, которая находится на Microsoft SQL Server 2008 Express. В этой базе будет только одна таблица с таким же названием и вот такой схемой:

clip_image004

В виде данных используем информацию о существующих движках для MVC Framework:

clip_image006

Сгенерируем модель по этой базе данных с помощью 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.

Комментариев нет:

Отправить комментарий