Pull to refresh

ASP.NET MVC 3: подробный обзор нововведений

Reading time8 min
Views10K
image

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

В этой статье будет дан обзор нововведений и изменений, которые произошли в новой версии фреймворка.

Совместимость и поддержка .NET Framework 4.0


В отличии от предыдущей версии, ASP.NET MVC 3 поддерживает только четвертую версию .NET Framework. Кроме того, компоненты разработчиков для интеграции в Visual Studio поддерживаются только для Visual Studio 2010 и Visual Web Developer Express 2010.

Фреймворк ASP.NET MVC 3 может быть установлен вместе с ASP.NET MVC 2, они могут использоваться отдельно друг от друга.

Переход с предыдущей версии на ASP.NET MVC 3


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

Для ручного обновления проектов на базе ASP.NET MVC 2 на новую версию ASP.NET MVC 3 Preview 1 необходимо проделать следующие действия:
  • заменить во всех файлах web.config строки System.Web.Mvc, Version=2.0.0.0 на строки System.Web.Mvc, Version=3.0.0.0;
  • удалить из проекта ссылку на сборку System.Web.Mvc второй версии и добавить сборку третьей версии фреймворка;
  • отредактировать файлы проекта .csproj, заменив значение элемента ProjectTypeGuids с {F85E285D-A4E0-4152-9332-AB1D724D3325} на {E53F8FEA-EAE0-44A6-8774-FFD645390401};
  • в случае, если проект ссылается на сборки собранные для ASP.NET MVC 2 добавьте в секцию configuaton файла web.config следующий код:



    image

Нововведения в ASP.NET MVC 3 Preview 1


В новой версии фреймворка появился ряд важных нововведений.

Поддержка Razor View Engine


Начиная с этой версии в ASP.NET MVC вводится поддержка нового синтаксиса разметки представлений Razor. Не так давно Razor был представлен в виде базового синтаксиса представлений в проекте инструментов веб-разработки WebMartix. Теперь Razor доступен и для разработки MVC-приложений.

Razor представляет собой синтаксис оптимизированный для работы с HTML-кодом. Имеющийся в ASP.NET движок Web Forms во много ориентируется на элементы управления, а его код смотрится перегруженным среди HTML-кода. Напротив, Razor предлагает крайне оптимизированное решение, которое позволит лаконично встраивать в HTML-код логику представлений.

Рассмотрим пример. Ниже представлена форма построенная с помощью старого движка представлений (слева) и нового движка Razor (справа).

imageimage

Основное отличие Razor, которое бросается в глаза – это отсутствие открывающих и закрывающих наборов “<% %>”. Действительно, даже синтаксис группировки @using не содержит закрывающих элементов и представлен только замыкающим символом “}”. Сравните это с необходимостью писать “<% } %>” в варианте WebForms и вы поймете в чем состоит основной упор при разработке Razor – производительность труда разработчика через уменьшение кода и его лаконичность.

Особенно, удобство Razor проявляется при создании в коде ветвлений, например, вот как выглядит некий код в WebForms и Razor:

image image[40]

Набирать ветвления, требующие отбивать условия от разметки элементами “<% %>” – это очень утомительно. С другой стороны, посмотрите насколько гармонично смотрится ветвление разметки при использовании Razor. То же самое преимущество демонстрирует и во многих других случаях, например циклах.

В Razor есть отличия не только в ином синтаксисе открывающих и закрывающих символов. Так, например ниже представлен код конфигурации страницы и задания ее заголовка для WebFroms:

image

Такой же код, но в стиле Razor представлен ниже:

image

Значительно больше подробностей про движок представлений Razor вы можете узнать из этого перевода статьи Скотта Гатри.

Поддержка нескольких движков представлений в Visual Studio


С созданием нового движка представлений Razor, разработчики MVC озаботились предоставлением возможность выбора разработчику того, какой именно механизм он будет использовать. В инструментах Visual Studio появилась возможность выбора движка представлений при создании нового представления.

clip_image001

Динамические свойства View и ViewModel


Так как MVC3 поддерживает только .NET 4.0 разраотчики фреймворка смогли использовать преимущества новой версии .NET в ASP.NET MVC.

Одним из таких преимуществ является поддержка новых динамических типов. В MVC 3 знакомое свойство ViewData представлено в виде двух динамических реализаций View и ViewModel. Это позволяет вам вместо следующего кода:

ViewData["Title"] = "The Title";</em
ViewData["Message"] = "Hello World!";


инициализировать значения по-другому:

ViewModel.Title = "The Title";
ViewModel.Message = "Hello World!";

Возможность на лету создавать расширения для объектов – это свойство динамического типа в .NET 4.0. Доступ к полям в контексте представления в данном случае будет упрощен:

<h2>View.Title</h2>
<p>View.Message</p>

Поддержка Dependency Injection


В MVC 3 разработчики увеличили возможности расширения фреймворка и добавили поддержку инъекций кода «из коробки» без необходимости прибегать к собственным реализациям.

В ASP.NET MVC 3 Preview 1 добавлена возможность проводить инъекции в следующих местах:
  • создание фабрики контроллеров;
  • создание контроллеров;
  • разные этапы работы движков представлений, как Web Forms так и Razor;
  • работа фильтров действий (action filters).
Для осуществления инъекции разработчику необходимо определить реализацию интерфейса IServiceLocator:

image

После этого, разработчик регистрирует новый экземпляр с помощью глобального статического класса, который определен следующим образом:



Разработчик вызывает метод SetCurrent, чтобы установить новую реализацию IServiceLocator.

После добавления новой реализации механизм ASP.NET MVC 3 будет использовать ее для следующих целей:
  • инстанцирование фабрики контроллера и самих контроллеров;
  • инстанцирование движков представлений и самих страниц представлений;
  • инстанцирование фильтров действий.
В следующих версиях ASP.NET MVC 3 появятся дополнительные возможность по инъекции кода:
  • для механизма Model Binder;
  • для провайдеров значений (Value Providers);
  • для провайдеров валидации;
  • для провайдеров метаданных моделей.
В связи с введением поддержки инъекций кода в поведение стандартных механизмов ASP.NET MVC были внесены следующие изменения:
  • ControllerBuilder.GetControllerFactory будет вначале обращаться к имеющейся реализации IServiceLocator и только потом, если реализация отсутствует, использовать старый механизм создания фабрики контроллеров;
  • DefaultControllerFactory при создании контроллеров будет вначале обращаться к имеющейся реализации IServiceLocator и только потом, если реализация отсутствует, использовать старый механизм для создания контроллеров;
  • функция DefaultControllerFactory.ReleaseController – освобождение контроллера — будет производится только через реализацию IServiceLocator, в случае если реализации нет, то будет использоваться реализация по умолчанию от специального интерфейса IMvcServiceLocator;
  • ViewEngineCollection, по-прежнему, позволит добавлять коллекции движков представлений, но кроме этого в MVC 3 эта коллекция будет виртуально содержать все движки представления, зарегистрированные в реализации IServiceLocator. Что означает, что вызовы методов .FindView или .FindPartialView вернут обобщенные значения как добавленные вручную, так и определенные с помощью реализации IServiceLocator;
  • WebFormView был обновлен, так что страницы и элементы управления создаются с помощью реализации IServiceLocator или старым способом через Activator.CreateInstance, если создать страницу через реализацию IServiceLocator не удается.

Глобальные фильтры


В MVC 3 добавлен механизм глобальных фильтров, который позволит вам определить фильтры, которые будут вызваться при каждом вызове действий любого контроллера. Для добавления фильтра используется глобальный статический класс GlobalFilters:

GlobalFilters.Filters.Add(new MyActionFilter());

Вы можете переопределить механизм глобальных фильтров, создав инъекцию для нового интерфейса IFilterProvider. Это позволит вам создать собственную логику выполнения глобальных фильтров.

Провайдер значений JsonValueProviderFactory


Новый провайдер значений позволит вашим действиям получать запросы с наборами параметров в формате JSON и сопоставлять их с параметрами метода действия. Ранее этот функционал размещался в библиотеки ASP.NET MVC Futures.

Например, если POST-запрос с MIME-типом application/json будет содержать значение:

{“ProductName”: “Milk”, “Cost”: “12.0”}

То с помощью провайдера JsonValueProviderFactory эти значения автоматически присвоятся параметру с типом ProductModel в следующем действии:

[HttpPost]
public ActionResult SaveProduct(ProductModel productModel)
{

}

где тип ProductModel объявлен как

public class ProductModel
{
publiс string ProductName {get;set;}
public string Cost {get;set;}
}


Поддержка атрибутов валидации .NET 4.0 и интерфейса IValidatableObject


Класс ValidationAttribute был обновлен в .NET 4.0 и расширен новым перегруженным методом IsValid с параметром типа ValidationContext. Этот параметр, кроме нового значения свойства, содержит контекст валидации и экземпляр объекта валидации. Это позволит вам проверить не только текущее свойство, но и другие свойства объекта и произвести валидацию на основании их значений.

image

Пример выше демонстрирует сравнение двух свойств объекта переданного в контексте валидации.

Кроме того, в .NET 4.0 добавлен новый интерфейс IValidatableObject, который позволит определить логику валидации на уровне класса вашей модели.

image

Определенная выше модель реализует интерфейс IValidatableObject для собственной валидации. MVC 3 поддерживает этот интерфейс и производит валидацию модели на его основании.

Интерфейс IClientValidatable


Этот новый интерфейс объявлен как

image

Он предназначен для предоставлении сторонними фреймворками валидации информации о поддержке клиентской валидации.

Поддержка атрибутов метаданных .NET 4


В MVC 3 поддерживаются новые атрибуты метаданных, которые были представлены в .NET 4. Например, DisplayAttribute. Полный список новых атрибутов, которые действительно используются в MVC 3 предоставить пока нельзя, информации по этому вопросу нет, а исходные коды проекта пока недоступны.

IMetadataAware


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

image

Он предназначен для возможности определения момента создания метаданных для модели и возможности произвести дополнительные действия в этот момент. Этот интерфейс используется классами наследованными от AssociatedMetadataProvider, например классом метаданных DataAnnotations – DataAnnotationsModelMetadataProvider.

Новые типы результатов действий


В MVC 3 появился ряд новых типов для возвращения результатов действий.

HttpNotFoundResult

Простой тип результата действия, который возвращает результат указывающий на то, что запрошенный ресурс не был найден (HTTP 404). Контроллеры содержат новый вспомогательный метод HttpNotFound(), который возвращает тип HttpNotFoundResult:

image

HttpStatusCodeResult

Новый класс объявлен как

image

Класс HttpStatusCodeResult предназначен для возврата произвольного HTTP-кода, как результата действия.

Как видно, он содержит два конструктора которые принимают цифровое значение HTTP-кода и второй принимает дополнительно строку с описанием результата.

Постоянный редирект

В MVC3 добавлена поддержка возврата результатов действий в виде постоянного редиректа (HTTP 301). Это можно сделать с помощью следующих новых методов контроллера:
  • RedirectPermanent – производит перенаправление на указанный URL;
  • RedirectToRoutePermanent – производит перенаправление по текущему маршруту (либо можно указать необязательные параметры routeName и routeValues);
  • RedirectToActionPermanent — производит перенаправление на указанное действие (можно указать необязательные параметры controllerName и routeValues).

Изменения несовместимые с MVC2


Был изменен порядок выполнения фильтров исключений (exception filters). Ранее фильтры исключений, примененные к контроллеру, выполнялись раньше чем фильтры примененные к действию (если значение Order у них было одинаковым). Теперь и далее это поведение меняется. Первыми будут выполняться фильтры исключений у действий, а за ними фильтры применяемые к контроллерам. Если значение Order у этих фильтров различное, то выполняться они будут как и прежде согласно порядку определенному в Order.

Известные проблемы


Этот выпуск имеет ряд проблем, которые будут устранены в будущих релизах:
  • Нет подсветки синтаксиса и поддержки IntelliSense в Visual Studio для движка представлений Razor;
  • Отсутствует возможность использовать функцию Go To Controller при редактировании файлов .cshtml (Razor);
  • Отсутствуют доступ к сниппетам Visual Studio при редактировании кода с движком представлений Razor.

Заключение


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

Именно поэтому, для изучения и тестирования нового функционала, частями и выпускаются предварительные версии. Я призываю всех разработчиков на ASP.NET MVC обратить самое пристальное внимание на релиз MVC3 Preview 1 и уделить свое время изучению его новых функций.
Tags:
Hubs:
+43
Comments33

Articles

Change theme settings