Вышла новая версия ASP.NET MVC 3 Beta







clip_image001

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

Загрузить ASP.NET MVC 3 Beta можно по этой ссылке.

Улучшенный контроль над  валидацией запросов

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

image

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

Новое правило конвертации ‘_’ в ‘-’ в хелпер-классах

HTML5 в своих атрибутах (например, data-*) использует дефисы. Однако, в C# для переменных использование дефисов запрещено и это приводит к невозможности использовать в хелпер-методах задание атрибутов через анонимные типы. Например, следующий код вызовет ошибку:

image

Для решения этой проблемы, в MVC 3 Beta вводится соглашение, согласно которому имена определенные в анонимных типах хелпер-методов с символом подчеркивания ‘_’ будут транслироваться в атрибуты с дефисом.

код

image

разметка

image

Дополнительная поддержка Dependency Injection

В первой превью-версии ASP.NET MVC 3 появилась встроенная поддержка внедрений зависимостей кода (Dependency Injection). В новой версии эта поддержка была расширена.

IDependencyResolver на смену IServiceLocator

Представленный в превью-версии интерфейс IServiceLocator был заменен на упрощенную версию IDependencyResolver. Теперь вместо старого интерфейса:

clip_image002

роль Common Service Locator играет следующий интерфейс:

clip_image003

Соответственно, на смену статического класса MvcServiceLocator пришел класс DependencyResolver. Регистрация своего экземпляра класса реализующего интерфейс IDependencyResolver выглядит просто:

clip_image004

Например, ниже реализация IDependencyResolver для использования DI-контейнера Unity в MVC 3 Beta:

clip_image005

Обратите внимание, методы GetService и GetServices должны возвращать null и пустую коллекцию (важно) соответственно, в случаях, когда невозможно вернуть тип из контейнера. Если MVС получит эти значения, то для работы будут использоваться значения объектов поддерживаемых механизмом внедрения зависимостей установленные по умолчанию. К примеру, если ваш контейнер не содержит тип для фабрики контроллеров, то он (контейнер) должен вернуть null на запрос с типом IControllerFactory и MVC будет использовать для работы класс DefaultControllerFactory.

Регистрация этого интерфейса выглядит следующим образом (global.asax):

clip_image006

Хотя IDependencyResolver заменил IServiceLocator, в статическом классе DependencyResolver осталась возможность регистрировать экземпляры реализующие интерфейс Common Service Locator.

IControllerActivator

Новый интерфейс IControllerActivator позволяет управлять созданием конкретного экземпляра контроллера. В отличии от фабрики контроллеров, IControllerActivator отвечает только за инстанцирование определенного типа, тогда как фабрика занимается еще и поиском нужных типов контроллеров. Интерфейс IControllerActivator объявлен следующим образом:

clip_image007

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

clip_image008

Разработчику остается зарегистрировать реализацию IControllerActivator в к своем DI-контейнере и фабрика контроллеров будет использовать его для инстанцирования контроллеров. Ниже простейший пример реализации IControllerActivator, который просто возвращает экземпляры контроллеров из контейнера.

clip_image009

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

IViewPageActivator

IViewPageActivator предлагает функционал аналогичный IControllerActivator, но только применительно к представлениям.

clip_image010

IViewPageActivator позволяет определить класс который будет отвечать за создание представлений. Для поддержки нового интерфейса у классов WebFormView и RazorView (отвечают за представления в Web Forms и Razor соответственно) появились новые конструкторы с параметром типа IViewPageActivator.

Это нововведение позволит сделать внедрение кода в процесс создания представлений или элементов управления.

Дополнительная автоматическая поддержка внедрения кода

В дополнение к реализованной ранее поддержке внедрения кода для фабрики контроллеров, контроллеров, движков представлений, представлений и фильтров действий, в MVC 3 Beta добавлен еще ряд областей, где происходит автоматическая поддержка DI:

  • провайдеры валидации моделей – классы реализующие абстрактный класс ModelValidatorProvider могут автоматически использоваться при валидации модели, если их поместить в DI-контейнер;
  • провайдеры метаданных моделей – класс реализующий абстрактный класс ModelMetadataProvider может автоматически использоваться для предоставления метаданных при валидации и работе с шаблонами, если его поместить в DI-контейнер;
  • провайдеры значений (Value providers) - классы реализующие абстрактный класс ValueProviderFactory могут автоматически использоваться при связывании модели, если их поместить в DI-контейнер;
  • классы связывания модели (Model binders) - классы реализующие интерфейс IModelBinderProvider могут автоматически использоваться при создании связующих классов для модели, если их поместить в DI-контейнер.
Поддержка ненавязчивого синтаксиса при Ajax и валидации

В ASP.NET MVC есть ряд хелпер-методов для работы с Ajax-запросами. Например,

Ajax.ActionLink. Ранее, использование этих методов на странице генерировало в разметке встроенный javascript для обработки Ajax, а это не так хорошо, как если бы скрипты были вынесены в отдельный файл и использовался бы ненавязчивый (unobtrusive) подход в разметке.

С выходом MVC 3 Beta для всех Ajax-методов появляется поддержка ненавязчивого javascript. Производится это с помощью внедрения специальных атрибутов  data-ajax-*. Например, при использовании Ajax.ActionLink теперь будет генерироваться следующая разметка:

код

image

разметка

image

Всю работу по обработке новой разметки берет на себя специальный javascript-файл jquery.unobtrusive.ajax.js, который необходимо включать на все страницы с ajax-функционалом MVC Framework. Работает этот файл на базе jQuery, поэтому и эту библиотеку (версия 1.4.1 и выше) необходимо включить на страницы.

В MVC 3 Beta ненавязичивое употребление javascript применяется так же для клиентской валидации пользовательского ввода. Чтобы использовать ненавязчивый javascript при валидации используйте в разметке следующие хелпер-методы:

image

image

Всю работу в данном случае берет на себя javascript-файл jquery.validate.unobtrusive.js, который основан на jQuery и требует подключения этой библиотеки (jquery-1.4.1.js), а так же скрипта jQuery-валидации (jquery.validate.js).

Необходимо отметить, что функционал ненавязчивого javascript управляется через параметр в файле web.config:

image

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

Изменения в движке представлений Razor и Web Pages

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

Если ранее тип задавался через конструкцию вида:

Цитата

@inherits System.Web.Mvc.WebViewPage<MyModelNamespace.MyModelType>

то теперь, введен новая директива @model:

Цитата

@model MyModelNamespace.MyModelType

Поддержка кода выполняемого для всех представлений в Web Pages

В MVC 3 Beta появилась возможность задать код, который будет выполняться перед запуском всех представлений. Для этого используется новый файл _viewstart.cshtml, который необходимо расположить в папке Views. Вы можете использовать этот файл и для определенного набора представлений. Для этого расположите _viewstart.cshtml в любой подпапке с нужными представлениями.Файл  _viewstart.cshtml в подпапке имеет приоритет над общим файлом, который расположен в папке Views.

Новый функционал предназначен в первую очередь для централизованной установки единой компоновки для всех представлений. В проекте по умолчанию файл _viewstart.cshtml содержит следующее:

image

Здесь для всех представлений разом задается единая модель компоновки из файла _Layout.cshtml.

Новые хелпер-классы Web Pages

К существующим хелпер-класса типа ReCaptcha, Twitter или Validation добавлен ряд новых:

· Chart – рисование графиков;

· Crypto – алгоритмы шифрования;

· WebGrid – рендеринг данных в виде таблицы;

· WebImage – изменение и отображение изображения, добавление водяных знаков;

· WebMail – работа с электронной почтой;

· Facebook – добавление Like-кнопки.

Полный список всех хелпер-классов можно посмотреть здесь.

Поддержка VBHTML

В MVC 3 Beta представлена поддержка Razor для разработчиков использующих Visual Basic. Файлы c Razor-синтаксисом на Vb будут носить расширение .vbhtml.

Подробности по синтаксису можно узнать по этой ссылке http://www.asp.net/webmatrix/tutorials/asp-net-web-pages-visual-basic.

Улучшенное диалоговое окно "New Project"

clip_image011

Окно служащее для создания нового проекта было переработано. В него, помимо возможности выбора типа приложения, добавили возможность выбора используемого механизма представлений (view engine).

Исправленные ошибки

В MVC 3 Beta исправлены некоторые ошибки:

  • шаблон для EditorFor и DisplayFor используемый по умолчанию теперь принимает во внимание параметр Order в атрибуте DisplayAttribute. То есть появилась возможность управлять порядком отображения элементов модели в шаблоне по умолчанию;
  • клиентская валидация теперь поддерживает валидацию переопределенных свойств, которые объявлены с атрибутами валидации;
  • фабрика JsonValueProviderFactory теперь зарегистрирована по умолчанию.
PS:

К сожалению, в этой версии MVC 3 так и не появилась подсветка синтаксиса и работа intelliSense при использовании Razor. Но с первой проблемой можно справиться. Для загрузки доступен плагин к Visual Studio 2010, который добавляет подсветку синтаксиса в razor-представлениях. Загрузить Razor Syntax Highlighter можно отсюда.

Progg it
Добавить комментарий






иван
06.10.2017 14:54
0
Скажите, почему нельзя пользоваться Razor не в MVC, а просто в aspx или WebForms? Всё обсуждение Razor в контексте MVC, а мне хотелось бы просто пользоваться новым синтаксисом.
Denis Gladkikh
06.10.2017 15:00
0
Думаю, это связано с тем, что основа WebForms все таки в серверных контролах, типа asp:..., и в принципе там вообще должно быть мало inline кода на aspx страницах. А вот в MVC все наоборот, серверных контролов нет, все при помощи inline кода строится.
Так и какой смысл переносить Razor в WebForms, ради пары написаний inline кода?
06.10.2017 15:01
1
Razor сделан как альтернатива Web Forms View Engine, поэтому в Web Forms его использовать не получится. Да и большой вопрос нужен ли новый синтаксис в Web Forms?

Если вам интересен Razor присмотритесь к WebMatrix и Web Pages.
иван
06.10.2017 15:12
0
Спасибо Денис и Владимир за ответы!
tt
06.10.2017 16:11
0
Webmatrix поддерживает ASP MVC 3 ?
И когда ожидается релиз Webmatrix ?
06.10.2017 16:32
0
webmatrix - это среда разработки, в основном для Web Pages и Razor, но можно работать и с MVC-проектами

релиз не знаю, вторая бета-версия - скоро.
guest
06.10.2017 16:52
0
>Новые хелпер-классы Web Pages
Это же вроде не к mvc относится а к матрице?
Андрей
06.10.2017 18:14
0
tt, WebMatrix поддерживает разработку на ASP.NET и PHP, но эт оскорее инструмент для начинающих веб-разрабочков. В WebMatrix поддерживается работа с SQL Server и MySQL, стиль кода Razor, внедрен модуль SEO. Beta доступна уже сейчас, релиз вроде будет весной
ilog
06.10.2017 20:19
0
А мог бы кто-нибудь обрисовать, что внутри инсталляционных пакетов, собственно - в AspNetWebPages.msi ? Мне совершенно неинтересна WebMatrix и ее хелперы, только MVC3 & Razor, так нужно ли инсталлировать WebPages?

И еще - а что за ключ для appSettings "enableSimpleMembership" упоминается в документации? Что за упрощенный мембершип?
06.10.2017 20:37
0
нужно устанавливать, без этого установка mvc 3 не запустится
stuhin
06.10.2017 22:51
0
Только перестал работать в Razor
@RenderSection("content",optional:true)
сама секция работает если без optional:true
viking
07.10.2017 13:10
1
У Фила в блоге обсуждалась проблема с RenderSection(..), в VB optional ключевое слово, поэтому переделали на:
@RenderSection("content", required: false)
stuhin
08.10.2017 3:36
0
Да седня глянул, оба ответили)) я и у Скотта тоже самое спрашивал... решил здесь ответ написать но меня опередили))
Добавить комментарий