Галерея дизайнов ASP.NET MVC и грядущие улучшения представлений (View) в релиз-кандидате ASP.NET MVC

Раз уж речь зашла о пользовательском интерфейсе, хочу также рассказать кое-что про улучшения, связанные с представлениями (View), реализованные в сборке релиз-кандитата ASP.NET MVC, которая в скором времени станет доступна для загрузки. Помимо исправлений ошибок, релиз-кандидат включает множество связанных с представлениями дополнительных возможностей, а также изменений и дополнений, реализованных на основе пожеланий сообщества разработчиков.

Представления без code-behind файлов

На основе многочисленных отзывов разработчиков мы решили внести изменение с тем, чтобы файлы представлений MVC по умолчанию не имели code-behind файлов. Это изменение позволит представлениям лучше соответствовать своему основному предназначению в рамках MVC (а предназначены они исключительно для рендеринга и потому по возможности не должны содержать код, к рендерингу не относящийся), а большинству разработчиков оно позволит избавиться от не используемых в проекте файлов.

В бета-версии ASP.NET MVC разработчики могли избавиться от code-behind файлов в представлениях за счет использования синтаксиса CLR для типов-дженериков в атрибуте представлений inherits, но этот синтаксис CLR является, мягко говоря, неочевидным и трудным в использовании. Команда ASP.NET MVC за счет сочетания некоторых возможностей расширения, уже имеющихся в ASP.NET, смогла позволить использовать стандартный синтаксис языков VB/C# для указания типов-дженериков в атрибуте inherits в релиз-кандидате ASP.NET MVC.

Одним из приятных преимуществ отказа от code-behind файлов в представлениях является то, что вы теперь можете использовать IntelliSense сразу после того, как добавите представление в проект. В бета-версии требовалось сначала выполнить компиляцию/сборку после создания представлений, чтобы в них заработал IntelliSense. Релиз-кандидат позволяет избавиться от промежуточного этапа компиляции в процессе добавления в проект представления и его последующего редактирования.

Свойство верхнего уровня Model в представлениях

С предыдущими сборками ASP.NET MVC для доступа к строго типизированному объекту модели, переданному в представление, вам приходилось использовать свойство ViewData.Model:

Приведенный выше синтаксис еще работает, но теперь вы можете использовать новое свойство Model, появившееся у ViewPage:

Здесь обращение к свойству эквивалентно предыдущему примеру коду - основное преимуещество его использования в написании более компактного кода.

Вспомогательные методы HTML/AJAX теперь поддерживают синтакс выражений (Expressions)

Одной из возможностей, которую просили реализовать некоторые разработчики, была поддержка строго типизированного синтаксиса выражений (вместо использования строк) для ссылок на модель при использовании объектов вспомогательных классов HTML/AJAX.

В бета-версии ASP.NET MVC это было невозможно, поскольку вспомогательные классы HtmlHelper и AjaxHelper не раскрывали тип модели в своей сигнатуре, и людям для использования строго типизированного синтаксиса приходилось создавать вспомогательные методы непосредственно в базовом классе ViewPage. В релиз-кандидате ASP.NET MVC появились новые типы HtmlHelper и AjaxHelper, доступные в базовом классе ViewPage. Эти типы позволяют теперь любому создавать строго типизированные вспомогательные расширения HTML и AJAX, использующие синтаксис выражений при обращении к модели представления

К примеру, я мог бы создать (очень простенький) строго типизированный вспомогательный метод "TextBox", написав такой код:

И затем использовать его в любом из представлений с привязкой к объекту модели Product примерно так:

Кроме того, при работе с моделями представлений в редакторе кода Visual Studio для строго типизированного синтаксиса выражений полностью поддерживается IntelliSense:

Внимание! вспомогательные расширения HTML в сборке ядра ASP.NET MVC V1 будут продолжать использовать существующий синтаксис, не основанный на выражениях. Мы планируем добавить основанные на выражениях версии вспомогательных методов в сборку MVCFutures. Разумеется, вы можете добавлять свои собственные вспомогательные методы (использующие либо строки, либо строго типизированные выражения). Все встроенные вспомогательные методы могут быть при желании удалены (потому что они являются расширениями основной функциональности) в случае, если вы захотите заменить их своими собственными или перекрыть.

Поддержка создания лесов

Релиз-кандидат ASP.NET MVC включает поддержку автоматического создания "строительных лесов" для пользовательского интерфейса, если вы в Visual Studio добавляете в проект представления с помощью новой команды "Add View". Поддержка создания "лесов" позволяет автоматически генерировать представления для любых типов или объектов .NET, т.е. данная возможность доступна для POCO-классов, LINQ to SQL, LINQ to Entities, NHibernate, SubSonic, LLBLGen Pro и любых других объектных моделей. Движок создания "лесов" использует отражение для получения открытых (public) членов типа модели представления, после чего передает полученные данные в шаблон создания "строительных лесов" для заполнения на их основе соответствующих элементов разметки в создаваемом представлении.

Предположим, к примеру, что у нас есть класс ProductsController, и мы хотим создать в нем действие "Edit", отображающее представление для редактирования экземпляра Product. С помощью релиз-кандидата ASP.NET MVC мы можем щелкнуть правой кнопкой мыши внутри метода для нашего действия "Edit" и выбрать пукнт контекстного меню "Add View", как показано на рисунке:

В диалоговом окне "Add View" мы можем указать, что передаем в представление тип Product:

Мы можем указать, что хотим создать "пустой" (Empty) шаблон представления (как в примере выше) или же указать, чтобы VS автоматически создала "строительные леса" для представления действия "Edit" в соответствии с передаваемым типом Product:

Если мы выберем шаблон "Edit", VS автоматически создаст для нас файл, содержащий соответствующую HTML-разметку и вспомогательные методы проверки ввода для создания формы представления:

Запустив приложение, мы тут же увидим работающий пользовательский интерфейс:

После этого мы можем изменить сгенерированный файл edit.aspx так, как нам необходимо.

Одна из замечательных особенностей поставляемой системы построения "строительных лесов" - это то, что она создана на базе встроенной в Visual Studio системы генерации кода T4 (Скотт Хансельман написал хорошую заметку на эту тему). Шаблоны "List", "Edit", "Create" и "Details", поставляемые с ASP.NET MVC, могут быть кастомизированы или же заменены вашими собственными шаблонами T4 (или же загруженными Галереи дизайнов ASP.NET MVC). Так что если вы особым образом создаете HTML или же хотите использовать какие-то специфические вспомогательные методы (к примеру, на базе строго типизированных выражений), вы можете изменить шаблоны, используемые по умолчанию, и система построения "лесов" в дальнейшем будет учитывать внесенные вами изменения.

Мы собираемся реализовать поддержку изменения шаблонов как на уровне установленной системы, так и на уровне отдельного проекта (так что вы сможете загружать кастомизированные шаблоны системы построения "лесов", специфичные для того или иного проекта, вместе с прочими файлами проекта в репозитарий системы контроля версий и делиться ими с другими членами команды разработчиков).

Задание MSBuild для компиляции файлов представлений

По умолчанию при сборке (build) проекта ASP.NET MVC компилируется весь код проекта, за исключением кода в файлах представлений. В версии ASP.NET MVC Beta вам приходилось создавать собственное задание MSBuild, если вы хотели скомпилировать представления. Релиз-кандидат ASP.NET MVC теперь включает встроенное задание MSBuild, которое вы можете использовать для включения представлений в процесс компиляции файлов проекта. При этом будет выполнена проверка синтаксиса и кода во всех представлениях и master-страницах приложения, и в случае каких-то проблем в них в ходе сборки вы увидите сообщения об ошибках.

Из соображений производительности мы не рекомендуем вам запускать это задание в ходе быстрой компиляции в процессе разработки; было бы разумно добавить специальные профили настроек сброки (например: поставка и развертывание) и/или использовать его вместе с серверами сборки или непрерывной интеграции (CI, continuous integration).

Другие новые возможности релиз-кандидата ASP.NET MVC

Выше был приведен краткий список некоторых новых возможностей, относящихся к представлениям, которые станут доступны с выходом релиз-кандидата ASP.NET MVC.
Помимо этого в релиз-кандидате вы найдете множество других новых возможностей, включая: поддержку IDataErrorInfo для предоставления моделям доступа к сообщениям об ошибках проверки данных, а также для предоставления более гибких возможностей расширения проверок на ошибки, чтобы вы могли использовать свой собственный подход к выявлению ошибок проверки данных моделей в ModelBinders (поддержка IDataErrorInfo реализована на их основе); новые типы FileResult и JavaScriptResult ActionResult (позволяющие в браузере проще загружать файлы, а также исполняемые сценарии JavaScript); встроенная поддержка IntelliSense для jQuery -vsdoc; переработанная поддержка AccontController для упрощения блочного тестирования и расширения с использованием сценариев аутентификации на базе форм; многочисленные улучшения шаблонов проектов, повсеместное улучшение расширяемости имеющегося функционала; куча исправленных ошибок; и еще несколько классных возможностей, о которых я напишу в своем блоге уже после выхода релиз-кандидата.

Релиз-кандидат ASP.NET MVC будет выпущен в январе. Мы планируем сделать его версией 1.0 ASP.NET MVC API и достичь нулевого уровня известных ошибок. После выпуска мы дадим людям некоторое время на обновление и основательную проверку этой сборки, чтобы получить сообщения об ошибках, которые мы могли допустить в последний момент. Вскоре после этого мы выпустим официальную версию 1.0 ASP.NET MVC (теперь-то ждать осталось уже недолго).

Надеюсь, вы нашли для себя что-то полезное,
Скотт

оригинал статьи