Команда ASP.NET только что выпустила для предварительного ознакомления ASP.NET MVC версии 2. Скачать эту версию можно здесь.

Эта версия работает с .NET 3.5 SP1 и VS 2008 и может быть установлена на одной машине совместно с ASP.NET MVC 1.0 (это значит, что они не конфликтуют, и ваши имеющиеся проекты ASP.NET MVC 1.0 никак не будут затронуты в случае такой установки). Если у вас установлены и ASP.NET MVC 1.0, и ASP.NET MVC 2.0, то вы увидите в диалоге “New Project” Visual Studio 2008 два шаблона проектов ASP.NET MVC:

В документации к версии ASP.NET MVC 2, выпущенной для предварительного ознакомления, детально описано, как обновить имеющиеся проекты ASP.NET MVC 1.0 для использования версии 2, если вы захотите портировать их, чтобы воспользоваться ее новыми возможностями.

Новые возможности

ASP.NET MVC V2 будет включать целый ряд новых возможностей и функций (некоторые из них уже были озвучены на странице плана развития ASP.NET MVC). Выпущенная сегодня сборка для предварительного ознакомления (“Preview 1”) дает первое представление о некоторых из новых возможностей; множество других вы сможете увидеть в последующих сборках для предварительного ознакомления. Сегодняшний выпуск все же является довольно ранним - он сделан, чтобы команда разработчиков могла начать собирать отзывы разработчиков и вносить соответствующие изменения.

Ниже приведено краткое описание некоторых новых возможностей выпущенной сегодня версии.

Поддержка областей (Areas)

В ASP.NET MVC 2 появилась поддержка новой возможности, называемой “области” (“areas”), позволяющей вам легче разделять и группировать функциональность в рамках MVC-приложения.

Области предоставляют способ группировки контроллеров и представлений, позволяя создавать блоки большого приложения в относительной изоляции от других его блоков. Каждая область может быть реализована как отдельный проект ASP.NET MVC, на который затем может ссылаться основное приложение. Такой подход помогает управлять сложностью при создании больших приложений и позволяет нескольким командам совместно работать над одним приложением.

Ниже представлен рисунок с изображением одного решения (solution), состоящего из трех проектов. Один из проектов называется “CompanySite” и включает в себя основные элементы наполнения сайта, его макет, контроллеры и представления. Отдельно представлены два проекта-“области”: “Blogs” и “Forums”. Эти проекты реализуют функциональность, представленную в URL-подразделах /Blogs и /Forums сайта и инкапсулирующую все правила маршрутизации, контроллеры и представления, реализующие эти подразделы:

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

Поддержка проверки DataAnnotations

В ASP.NET MVC 2 появилась встроенная поддержка проверки DataAnnotations, впервые представленных в .NET 3.5 SP1 и используемых в ASP.NET Dynamic Data и .NET RIA Services. Они предоставляют простой способ декларативного добавления правил проверки данных в классы Model и ViewModel в рамках приложения, а также автоматическую привязку элементов управления к источникам данных и создание вспомогательных методов проверки данных в пользовательском интерфейсе приложений ASP.NET MVC.

Чтобы увидеть вышеописанную возможность в действии, мы можем создать новый ViewModel-класс “Customer”, как показано на рисунке ниже, с пятью свойствами (реализованными с использованием новой возможности C# по автоматическому созданию свойств).

Затем мы можем дополнить свойства соответсвующими правилами проверки, воспользовавшись атрибутами DataAnnotation, реализованными в пространстве имен System.ComponentModel.DataAnnotations. Представленный ниже код использует 4 различных встроенных правила: [Required], [StringLength], [Range] и [RegularExpression]. В вышеупомянутое пространство имен также включен базовый класс (ValidationAttribute), на основе которого вы можете создать свои собственные атрибуты для реализации правил проверки данных.

Затем, мы можем создать класс CustomersController с двумя методами действий Create. Первый метод будет обрабатывать HTTP-запросы GET к URL “/Customers/Create” и выдавать шаблон представления, основанный на пустом объекте Customer. Второй метод будет обрабатывать HTTP-запросы POST к тому же URL (и принимать экземпляр класса Customer в качестве параметра). Он будет проверять, есть ли в переданных данных ошибки привязки к модели, и если есть - повторно отображать шаблон представления с уже введенными данными. Если же ошибок нет, он будет отображать пользователю представление, соответствующее успешному завершению операции:

Наконец, щелкнув правой кнопкой мыши в коде любого из представленных выше методов Create, мы можем выбрать пункт контекстного меню “Add View” и получить автоматически сгенерированный "каркас" шаблона представления “create”, основанного на классе Customer. Созданный таким образом "каркас" шаблона представления будет содержать следующую HTML-<форму> для объектов нашего класса Customer:

Теперь, запросив URL “/Customers/Create” в браузере, мы получим исходную пустую форму наподобие следующей:

Если мы введем какие-либо данные и отправим их на сервер (с использованием HTTP-метода POST), механизм привязки моделей к данным в ASP.NET MVC 2 обнаружит наличие атрибутов DataAnnotation у нашего класса Customer и автоматически произведет соответствующую проверку отправленных через форму данных. Если обнаружатся ошибки, наш метод действия контроллера повторно отобразит форму с указанием соответствующего сообщения об ошибке, как показано ниже. Обратите внимание, как строки сообщений об ошибках проверки данных, которые мы указали, используя атрибуты DataAnnotation свойств, отображаются пользователю вспомогательными методами Html.Validation. Для этого не нужен никакой дополнительный код.

Приведенная выше форма будет повторно отображать сообщения об ошибках каждый раз, когда пользователь вводит на форме некорректные данные и пытается отправить их на сервер.

Со следующей сборкой ASP.NET MVC 2 для предварительного ознакомления мы планируем поставлять плагин jQuery Validation как часть шаблона проекта по умолчанию, а также добавить поддержку автоматической проверки правил DataAnnotation на стороне клиента с помощью JavaScript. Это позволит разработчикам легко добавлять правила проверки данных лишь в одном месте - либо на объекте Model, либо на объекте ViewModel, и эти правила будут автоматически применяться как на стороне клиента, так и на сервере - везде, где тот или иной объект используется в приложении.

Если вы не хотите указывать правила проверки данных непосредственно на ваших классах Model или ViewModel, вы можете создать отдельный вспомогательный класс, дополняющий ваш класс модели и инкапсулирующий правила DataAnnotaton. Такая возможность также может пригодиться в тех случаях, когда VS непосредственно генерирует либо обновляет код свойств того или иного класса, и вы не можете с достаточной легкостью добавлять атрибуты в этот сгенерированный код (например, классы, генерируемые дизайнерами LINQ to SQL или LINQ to Entities).

В дополнение к предоставлению встроенной поддержки DataAnnotations, у класса DefaultModelBinder в ASP.NET MVC V2 теперь есть новые виртуальные методы, которые могут быть перегружены для интеграции других каркасов проверки данных (например, Castle Validator, EntLib Validation, etc). Вспомогательные методы, реализующие пользовательский интерфейс для проверки данных в ASP.NET MVC, спроектированы так, чтобы поддерживать любой каркас проверки данных (они "не знают" об использовании DataAnnotations для этих целей).

Строго типизированные вспомогательные методы для реализации пользовательского интерфейса (UI Helpers)

В ASP.NET MVC V2 включены новые вспомогательные методы HTML (HTML UI helpers), позволяющие использовать строго типизированные лямбда-выражения, когда вы ссылаетесь на объект модели шаблона представления. За счет этого можно улучшить проверку представлений во время компиляции (так что ошибки будут найдены во время сборки проекта, а не во время выполнения кода), а также улучшить поддержку IntelliSense для кода в шаблонах представлений.

Увидеть в действии улучшенную поддержку IntelliSense вы можете на рисунке ниже - обратите внимание, как я получаю полный список свойств объекта модели покупателя при использовании нового вспомогательного метода Html.EditorFor():

В выпущенной сборке ASP.NET MVC V2 реализована встроенная поддержка новых вспомогательных методов Html.EditorFor(), Html.LabelFor() и Html.DisplayFor(). В обновленной сборке MVC, которую мы выпускаем на этой неделе, помимо прочего, будут добавлены вспомогательные методы Html.TextBoxFor(), Html.TextAreaFor(), Html.DropDownListFor(), Html.HiddenFor() и Html.ValidationMessageFor() (со временем они также будут перемещены в сборку ядра ASP.NET MVC 2).

На рисунке ниже вы можете увидеть обновленную версию шаблона представления “create” (“создать”) для нашего сценария создания покупателя. Обратите внимание, что вместо использования для ссылок на объект покупателя строговых выражений мы теперь используем строго типизированные лямбда-выражения совместно со вспомогательными методами (UI helpers). Для всех этих выражений полностью работает IntelliSense и проверка на этапе компиляции:

Представленный выше вспомогательный метод Html.LabelFor() генерирует HTML-разметку <label for="Name">Name:</label>.

Чтобы создать поле ввода для любого примитивного типа данных, можно воспользоваться вспомогательным методом Html.EditorFor(). По умолчанию он сам подбирает подходящий тип HTML-элемента <input/> на основе типа данных, с которыми предстоит работать в поле ввода. К примеру, для первых четырех свойств в приведенном выше примере (являющихся строками и целыми числами) он создаст элементы <input type=”text”/>. Для последнего свойства “IsActive” булевского типа он создаст элемент <input type=”checkbox”/>.

Помимое поддержки примитивных типов данных вспомогательный метод the Html.EditorFor() также позволяет работать с более сложными объектами, имеющими множество различных свойств. По умолчанию этот метод переберет все открытые (public) свойства объекта и создаст для каждого соответствующий элемент <label>, <input/>, а также будет выводить любые подходящие сообщения об ошибках проверки данных, которые найдет в атрибутах свойств. К примеру, мы могли бы переписать предыдущее представление, использовуя всего лишь один вызов Html.EditorFor() для объекта Customer, - и получили бы на выходе в принципе тот же HTML-код, что и прежде:

Строго типизированные вспомогательные методы позволяют вам при желании добавить к свойствам класса ViewModel для объектов типа Customer атрибуты [DisplayName], которые будут определять, какие метки будут сгенерированы для представления того или иного свойства. К примеру, вместо “IsActive” мы могли бы получить более вразумительную метку, добавив к соответствующему свойству атрибут [DisplayName(“Is Active Customer:”)].

Кроме того, вы также можете добавлять атрибут [ScaffoldColumn(false)] для обозначения того, что определенные свойства вообще не должны попадать на формы в сценариях, подобных вышеописанному, когда вспомогательному методу Html.EditorFor() передаются целые объекты со своими наборами свойств.

Поддержка шаблонов вспомогательных методов

У вспомогательных методов Html.EditorFor() и Html.DisplayFor() есть встроенная поддержка отображения как примитивных типов данных, так и сложных объектов со множеством свойств. Как было отмечено выше, эти методы позволяют вам в определенной степени кастомизировать создаваемый ими HTML-код форм за счет применения к свойствам класса ViewModel атрибутов наподобие [DisplayName] и [ScaffoldColumn].

Впрочем, зачастую разработчики хотят получить еще больший контроль над тем, что генерируют вспомогательные методы. Во вспомогательных методах Html.EditorFor() и Html.DisplayFor() поддержка такой возможности реализована за счет механизма шаблонов, позволяющих переопределять и полностью контролировать генерируемый HTML-код. И, что самое интересное, вы можете изменять генерируемый контент для отдельных типов данных или классов.

В вышедшей сборке ASP.NET MVC 2 вы можете добавить подкаталоги “EditorTemplates” и/или “DisplayTemplates” либо в каталог \Views\[controllername] (если вы хотите кастомизировать генерируемый код для представлений, используемых определенным контроллером), либо в каталог \Views\Shared (если вы хотите кастомизировать генерируемый код для всех представлений и контроллеров в вашем приложении).

Затем в эти каталоги вы можете добавить файлы шаблонов, чтобы кастомизировать результат рендеринга HTML для определенных примитивных типов данных или классов. Например, я добавил подкаталог EditorTemplates в каталог \Views\Shared и добавил в него три своих шаблона:

Шаблон “Customer.ascx” отражает то, что я хочу кастомизировать генерируемый код каждый раз, когда Html.EditorFor() вызывается для объекта класса Customer (к примеру, я мог бы изменить порядок или представление свойств этого класса). Шаблон “DateTime.ascx” отражает то, что я хочу кастомизировать генерируемый код, генерируемый методом Html.EditorFor() для свойств типа DateTime (например, я мог бы написать на JavaScript окно выбора даты на календаре вместо обычного текстового поля ввода даты). В дополнение к этому, я мог бы создать шаблон “Object.ascx”, если бы хотел изменить генерируемый по умолчанию код для всех объектов.

Кроме изменения генерации HTML-кода для отдельных типов вы также можете создавать "именные шаблоны". К примеру, вы могли бы создать шаблон “CountryDropDown”, который применяется для строкового типа данных, но вместо обычного поля ввода генерирует выпадающий список <select> для выбора среди доступных названий стран. Ниже показано, как этот шаблон мог бы выглядеть:

Мы можем явно указать, что хотим использовать этот шаблон, передав его название в качестве аргумента Html.EditorFor(). В нижеприведенном примере мы не только указываем лямбда-выражение для нашего свойства Country, но и название для шаблона редактора, который необходимо использовать при рендеринге представления этого свойства на форме:

Еще можно использовать атрибут “UIHint” для ваших свойств ViewModel и типов данных. С помощью этого атрибута вы можете единожды указать, какой шаблон использовать по умолчанию для редактирования или отображения, и этот шаблон будет использоваться во всех представлениях в вашем приложении (без необходимости явно указывать его в качестве аргумента Html.EditorFor).

Ниже приведен пример того, как с помощью атрибута UIHint указать, что для строкового свойства Customer.Country следует по умолчанию для рендеринга использовать шаблон CountryDropDown:

После того, как мы установили указанный атрибут на нашей ViewModel, нам больше не нужно явно задавать название шаблона при использовании соответствующего свойства с Html.EditorFor(). И теперь после обновления страницы с URL /Customers/Create наше свойство Country вместо обычного текстового поля ввода будет отображено как выпадающий список:

Другие клевые возможности

В выпущенной сборке ASP.NET MVC 2 есть еще множество небольших, но приятных дополнительных возможностей. Вот некоторые из моих любимых:

Новый адтрибут [HttpPost]

В ASP.NET MVC обычным делом является разделение обработки URL между двумя методами действий – один обрабатывает запросы GET, а другой - POST.

В ASP.NET MVC 1 вам приходилось использовать атрибут [AcceptVerbs(HttpVerbs.Post)], чтобы обозначить “Post”-версию метода действия:

Это будет работать и в ASP.NET MVC 2, однако, теперь вы можете использовать более лаконичный атрибут [HttpPost], который делает то же самое:

Значения параметров по умолчанию

Обработка необязательных параметров является в веб-приложениях достаточно распространенной практикой. В ASP.NET MVC 1 вы могли обрабатывать необязательные параметры, либо регистрируя дополнительное правило маршрутизации (routing rule) и указывая значение по умолчанию с его помощью, либо помечая параметр метода действия как допускающий присвоение null (nullable) и добавляя в эти методы код, который проверяет, равно ли значение аргумента null, предоставляя в этом случае значение по умолчанию.

Выпущенная сборка ASP.NET MVC 2 поддерживает указание для параметров методов действий атрибута DefaultValueAttribute из пространства имен System.ComponentModel. Это позволяет указать, какое значение параметра должна передать ASP.NET MVC в случае, если его значение не было указано в запросе. Ниже представлен пример того, как мы могли бы обрабатывать ссылки и /Products/Browse/Beverages, и /Products/Browse/Beverages?page=2 URLs – и получать значение параметра “page”, равное “1”, если оно не было передано как часть строки запроса:

В VB можно указывать значения параметров по умолчанию непосредственно в коде (так что не нужно явно задавать атрибут DefaultValue, как в примере выше). C# в VS2010 также будет поддерживать значения по умолчанию для необязательных параметров, так что вы сможете упростить приведенный выше код, переписав его следующим образом:

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

Связывание с двоичными данными

В выпущенной сборке ASP.NET MVC V2 добавлена поддержка связывания строковых значений в кодировке base64 со свойствами типа byte[] и System.Data.Linq.Binary. Теперь есть две перегруженные версии Html.Hidden(), принимающие параметры этих типов. Это может пригодиться в сценариях, где вы хотите обеспечить в вашем приложении контроль параллелизма выполняемых действий и хотите передавать временнЫе метки записей БД на формы и обратно.

Резюме

Щелкните здесь, чтобы загрузить .zip-архив с файлами проекта ASP.NET MVC 2, в котором реализован код примеров, рассмотренных в этой статье.

Сегодня выпущена лишь первая сборка ASP.NET MVC 2 для предварительного ознакомления. В будущих сборках будет реализовано еще больше новых возможностей, и команда разработчиков ждет от вас отзывов и предложений, как еще можно улучшить новую версию.

Цель этого регулярного выпуска новых сборок для предварительного ознакомления - помочь вам убедиться в том, что к вашим отзывам прислушиваются, и каждый, кт�� хочет внести свой вклад в улучшение проекта, может реально это сделать. Пожалуйста, публикуйте все ваши отзывы, предложения или опсания проблем, с которыми вы столкнулись, на форуме ASP.NET MVC на сайте www.asp.net. Также дополнительные сведения о вышедшей версии вы можете найти в статье блога Филиппа Хаака (Phil Haack) о MVC2 и в видеотрансляции на Channel9 выступления Филиппа совместно со Скоттом Хансельманом (Scott Hanselman).

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

Скотт

P.S. В последнее время я чаще использую Twitter, чтобы рассказывать о предстоящих планах и публиковать ссылки на интересные ресурсы. Вы можете следить за моими публикациями на Twitter по адресу: http://www.twitter.com/scottgu (@scottgu это мой ник на Twitter)

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