понедельник, 28 февраля 2011 г.

Что нового в ASP.NET MVC 3


Введение

Версия ASP.NET MVC 3 построена на предыдущих версиях фреймворка ASP.NET MVC 1 и 2. Вместе с тем добавлено много новых возможностей, которые позволяют писать код еще проще и еще более гибко. Данная статья является поверхностным обзором тех нововведений, которые появились в новой версии фреймворка. Список новых возможностей описанных статье выглядит следующим образом:
  • Новый движок представлений Razor
  • Поддержка множества движков представлений
  • Улучшения в контроллерах
  •  JavaScript и AJAX
  • Улучшения валидации модели
  • Улучшения Dependency Injection
  • Прочие нововведения

Новый движок представлений Razor

В новой версии фреймворка появился новый движок представлений Razor. К его ключевым достоинствам можно отнести:
  • Синтаксис движка более сжатый и понятный, соответственно требуемое нажатие клавиш сводится к минимуму.
  • Прост в изучении, отчасти это связано с тем, что он базируется на существующих языках C# и Visual Basic.
  • Поддержка подсветки синтаксиса и IntelliSence студией.
  • Представления, написанные на Razor могут быть покрыты юнит тестами без необходимости запускать приложение и веб-сервер.
Новые возможности, которые появились вместе с Razor:
  • Синтаксис @model для указания типа переданной в представление модели
  • Синтаксис коментариев @* *@
  • Возможсноть указывать значения по умолчанию (например layoutpage) один раз для всего сайта
  • Метод Html.Raw для отображения текста без HTML-экранирования.
  • Поддержка вожности использования одного кода в нескольких представлениях (_viewstart.cshtml или _viewstart.vbhtml)
Razor включает новые HTML вспомогательные методы:
  • Chart. Рисует диаграмму, предлагая такие же свойства как и соответствующий элемент в ASP.NET 4.
  • WebGrid. Рисует датагрид, поддерживающий разбивку на страницы и сортировку по колонкам.
  • Crypto. Использует алгоритмы хеширования для создания защищенных и захешированных паролей.
  • WebImage. Рисует изображение
  • WebMail. Отсылает e-mail сообщение.
Для получения более подробной информации обращайтесь к следующим ресурсам:

Поддержка множества движков представлений

Диалог Add View в ASP.NET MVC 3 позволяет вам выбрать движок, с которым вы хотите работать, также диалог New Project позволяет вам указать движок используемый в проекте по умолчанию.  Вы можете выбрать движок Web Fords (ASPX), Razor или любой из движков с открытым  исходным кодом, такие как Spark, NHaml или NDjango.

Улучшения в контроллерах

Фильтры глобальных экшенов

Иногда возникает необходимость реализации некоторой логики перед выполнением метода экшена или же после его выполнения. Для того что бы реализовать подобный сценарий, ASP.NET MVC 2 использовал фильтры экшенов. Они представляют собой аттрибут определенный пользователем, который обеспечивает декларативное задание выполнения некоторой логики до или после выполнения экшена. Однако, в отдельных случаях может появится необходимость задания подобной логики (до и после выполнения экшена)  для всех экшенов. MVC 3 позволяет задать глобальные фильтры, путем помещения их в коллекцию GlobalFilters. Для получения более подробной информации обратитесь с следующим ресурсам:

Новое свойство «ViewBag»

Контроллеры MVC 2 поддерживают свойство ViewData, которое позволяет передавать данные в шаблон представления используя API словаря с позним связыванием (late-bound dictionary API). В ASP.NET MVC 3 также можно использовать более простой синтаксис, который делает то же самое, но использует свойство ViewBag. Например, вместо написания ViewData[“Message”]=”text” вы можете написать ViewBag.Message=”text”. Обратите внимание, вам не нужно определять какойто типизированный класс для того что бы использовать свойство ViewBag. Поскольку это свойство имеет тип dynamic, вам нужно просто задать имя свойства и оно будет определено динамическив процессе выполнения. Реализация ViewBag использует пары ключ/значение в словаре ViewData (В большинстве предрелизных версиях MVC 3 свойство ViewBag называлось ViewModel)

Новые типы “ActionResult”

Следующие типы ActionResults и соответствующие вспомогательные методы являются новыми или усовершенствоваными в MVC 3:
  • HttpNotFoundResult. Возвращает клиенту код HTML 404.
  • RedirectResult. Возвращает временную переадресацию (код HTML 302) или перманентную переадресацию (код HTML 301) в зависимости от булевого парамера. В соответствии с этим изменением, контроллер теперь имеет три метода для осуществления перманентной переадресации: RedirectPermanent, RedirectToRoutePermanent и RedirectToActionPermanent. Эти методы возвращают экземпляр RedirectResult с установленым флагом Permanent.
  • HttpStatusCodeResult. Возвращает код HTML заданный пользователем.

Улучшения JavaScripts и Ajax

По умолчанию, Ajax и вспомогательные объекты (helpers) для валидации в MVC 3 используют подход ненавязчивого JavaScript. Ненавязчивый JavaScript во многих случаях помогает избежать использование блоков JavaScript внутри HTML. Такой подход делает HTML разметку меньше и чище, а также позволяет более гибко изменять библиотеки JavaScript. Вспомогательные объекты для валидации в MVC 3 по умолчанию также используют плагин jQueryValidate. Если вам необходимо поведение MVC 2, можно отключить «ненавязчивый» JavaScript извенив соответствующие настройки в Web.config. Для получения более подробной информации об улучшениях JavaScript и Ajax обратитесь к следующим источникам:

Разрешенная по умолчанию валидация на стороне клиента

В более ранних версиях MVC для разрешения клиентской валидации необходимо было явно вызывать Html.EnableClientValidation из представления. В MVC 3 это больше не требуется, так как валидация на клиенте разрешена по умолчанию. (С помощью web.config это поведение можно изменить.)
Для того, что бы клиентская валидация работала, по прежнему необходимо ссылаться на библиотеки jQuery и jQuery Validation. Эти библиотеки можно разместить на собственном сервере или ссылаться на них, используя сеть доставки контента (CDN), например от Microsoft или Google.

Удаленный валидатор

ASP.NET MVC 3 поддерживает новый класс RemoteAttribute, который позволяет использовать удаленный валидатор из плагина jQuery Validation. Новый класс позволяет библиотеке клиентской валидации автоматически вызывать методы, определенные разработчиком на сервере, в случае, если валидация может быть осуществлена только на стороне сервера.
В примере, который показан ниже, атрибут Remote служит для указания, что механизм клиенской валидации в процессе валидации поля UserName будет использовать экшен UserNameAvailable контроллера UsersController.
public class User
{
    [Remote("UserNameAvailable", "Users")]
    public string UserName { get; set; }
}
Следующий фрагмент содержит код соответствующего контроллера.
public class UsersController
{
    public bool UserNameAvailable(string username)
    {
        if(MyRepository.UserNameExists(username))
        {
            return "false";
        }
        return "true";
    }
}
Для получения более детальной информации об использовании атрибута Remote можно обратиться к статье How to: Implement Remote Validation in ASP.NET MVC в библиотеке MSDN.

Поддержка привязки JSON

ASP.NET MVC 3 включает встроенную поддержку привязки (binding) JSON, которая делает возможным получение данных в формате JSON методами экшенов и привязки этих данных к модели через параметры методов экшена. Эта возможность может быть полезна в сценариях, в которых учавствуют клиентские шаблоны и привязка данных. (Клиентские шаблоны позволяют форматировать и отображать какой-то элемент данных или устанавливать новое значение для элемента с использованием шаблонов, которые выполняются на стороне клиента). MVC 3 позволяет легко подключать клиентские шаблоны к методам экшенов на сервере, которые могут отсылать и получать данные в формате JSON. Для получения более детальной информации о привязках JSON можно познакомится с секцией Усовершенствования JavaScript и Ajax в блоге Скотта Гефри посвященному MVC 3 Preview.

Улучшения валидации модели

Аттрибуты метаданных «DataAnnotations»

ASP.NET MVC 3 поддерживает атрибуты метаданных DataAnnotations, например DisplayAttribute.

Класс «ValidationAttribute»

Класс ValidationAttribute подвергся модификации в .NET 4. Теперь он поддерживает новое определение IsValid, призванное предоставлить более подробную информацию о текущем контексте валидации. С помощью этого контекста можно, например, узнать, какой объект в данный момент подвергается валидации. Наличие такой информации позволяет реализовать более гибкие сценарии, в которых можно выполнить валидацию текущего значения с учетом некоторого другого свойства модели. Например, новый атрибут CompareAttribute позволяет сравнить значения двух свойств модели. В последующем примере, свойство ComparePassword должно совпадать со значением поля Password.
public class User
{
    [Required]
    public string Password { get; set; }
    [Required, Compare("Password")]
    public string ComparePassword { get; set; }
}

Валидация интерфейсов

Интерфейс IValidatableObject позволяет выполнить валидацию на уровне модели и также позволяет предоставить сообщения ошибок валидации которые являются специфичными для состояния всей модели или между двумя свойствами модели. MVC 3 получает ошибки из интерфейса IValidatableObject которые возникают на этапе осуществления привязки модели и автоматически влияют на отображение полей в представлении, используя для этих целей вспомогательные средства фреймворка.
Интерфейс IClientValidatable позволяет фреймворку ASP.NET MVC определять на этапе исполнения, может ли валидатор использоваться на стороне клиента. Этот интерфейс был спроектирован таким образом, что он может быть совмещен с множеством других фреймворков.
Для получения более детальной информации можно обратиться к секции Усовершенствования валидации модели в блоге Скотта Гефри посвященному MVC 3 Preview.

Улучшения Dependency Injection

ASP.NET MVC 3 предоставляет лучшую поддержку для использования DI и для интеграции с существующими IoC-контейнерами. Поддержка DI была добавлена в следующих областях:
  • Контроллеры (регистрация и внедрение фабрик контроллеров, и самих контроллеров)
  • Представления (регистрация и внедрение движков представления, внедрение зависимостей между страницами представлений)
  • Фильтры экшенов (определение местоположения и внедрение фильтров)
  • Связующие звенья (binders) моделей (регистрация и внедрение)
  • Провайдеры валидации модели (регистрация и внедрение)
  • Провайдеры метаданных модели (регистрация и внедрение)
  • Провайдеры значений (регистрация и внедрение)
MVC 3 поддерживает библиотеку Common Service Locator и любой DI-контейнер, который поддерживает интерфейс данной библиотеки IServiceLocator. Кроме того имеется поддержка интерфейса IdependencyResolver, который делает более простым интеграцию DI фреймворков.
Для получения более подробной информации о DI в MVC 3, можно обратиться к следующим ресурсам:

Прочие нововведения

Интеграция с NuGet

ASP.NET MVC 3 автоматически устанавливает и делает доступным NuGet как часть своей установки. NuGet это бесплатный пакетный менеджер с открытым исходным кодом, который делает проще процесс поиска, установки и использования библиотек и инструментов .NET в проекте. Менеджер работает со всеми типами проектов Visual Studio (Включая ASP.NET Web Forms и ASP.NET MVC).
NuGet позволяет разработчикам, занимающимся поддержкой проектов с открытым исходным кодом (таких как Moq, NHibernate, Ninject, StructureMap, NUnit, Windsor, RhinoMocks и Elmah) cсоздавать пакеты библиотек и регистрировать их в онлайн галерее. После этого другие .NET разработчики, у которых есть потребность в использовании данной библиотеки смогут найти и установить ее в своем проекте с минимумом усилий.
Для получение более подробной информации о NuGet можно обратиться к документации NuGet расположенной на Codeplex.

Кеширование содержимого частичных страниц

У ASP.NET MVC есть поддержка кеширования содержимого всей страницы начиная с версии 1. MVC также поддерживает кеширование и частичных (partial) страниц, которое представляет собой простой способ кеширования отдельного региона или фрагмента страницы. Для получение более подробной информации о кешировании, можно обратиться к секции Кеширование содержимого частичных страниц в блоге Скотта Гефри посвященному MVC 3 Preview а также к секции Кеширование содержимого в MVC 3 Release Notes.

Гранулированный контроль валидации запросов

ASP.NET MVC имеет встроенную валидацию запросов, которая автоматически защищает от XSS атак и инъкций HTML. Однако иногда может появиться необходимость отключить эту валидацию, например, когда возникает необходимость в отсылке содержимого в виде HTML (например записи блога или содержимого CMS). Сейчас этот момент можно решить путем добавления атрибута AllowHtml в модель на свойство, которое не должно осуществлять валидацию во время привязки. Для получения более подробной информации о валидации запросов, можно обратиться к следующим источникам:

Расширенный диалог «Новый проект»

В ASP.NET MVC 3 можно добавлять шаблоны проектов, движков представлений и проектов для Юнит тестирования на диалоге «Новый проект»

Улучшения прототипирования (scaffolding)

Шаблоны прототипирования  ASP.NET MVC 3 делают работу по идентификации свойств первичных ключей на модели и соответствующую их обработку, лучше, чем в предыдущих версиях MVC. (Например, шаблоны прототипирования гаратнируют что первичный ключ не будет отображен на редактируемой форме.)
По умолчанию, Создание и Редактирование прототипа теперь использует Html.EditorFor вместо Html.TextBoxFor. Эти улучшения поддерживают метаданные модели в форме атрибутов аннотаций данных, когда диалог добавления представления генерирует экземпляр представления.

Новые перегруженные вспомогательные методы Html.Label и Html.LabelForModel

Новые перегруженные методы были добавлены для LabelFor и LabelForModel. Они позволяют указать или переопределить текст выводимой метки.

Поддержка контроллеров без сессий

В ASP.NET MVC 3 можно задать, нужно ли в классе контроллера использовать состояние сессии, и если да, то должно ли состояние сессии быть доступным только для чтения или для чтения и записи. Для получения более подробной информации о контроллерах без сессий можно обратиться к MVC 3 Release Notes.

Новый класс AdditionalMetadataAttribute

Атрибут может быть использован для заполнения коллекции ModelMetadata.AdditionalValues для свойства модели. Например, если модель содержит свойство, которое должно быть показано только администратору, его можно  задать, как показано ниже:
public class ProductViewModel
{
    [AdditionalMetadata("AdminOnly", true)]
    public string RefundCode {get; set;}
}
Эти метаданные могут быть использованы в любом шаблоне для отображения или редактирования. А интерпретация метаданных зависит от ее реализации разработчиком.