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

    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 и уделить свое время изучению его новых функций.
    Поделиться публикацией

    Похожие публикации

    Комментарии 33
      –1
      Рад что MVC развиваеться такими темпами. Единственное, что неудобно в плане изучений и работы над текущим проектом — нельзя что бы было уставнолено параллельно несколько версий.
        0
        почему нельзя? можно, MVC 2 и MVC 3 можно поставить рядом
          0
          А 2-й и 1-й?. А открыть проект без конвертации в более старшую версию тоже нельзя.
            0
            вы утверждаете что нельзя, я вам говорю, что с третьим можно и без конвертации. про первый я ничего не говорил
          0
          Смотря какие цели вы приследуете. У меня например фронт-енд работает и разрабатывается под MVC 1, а установлена MVC 2. Тоесть если интеграция в студию не очень важна, то все работает как часы. Ведь собсно MVC это просто набор либ. Референсиш, правиш конфиг и вуаля.
          0
          Разметка с Razor выглядит просто потрясно. Еще и выделение строк с кодом. Всегда одной из самых неприятных частей фреймворка была разметка представления в купе с ужасным форматированием кода в студии.
          А есть ли там теги вроде @= или @:?
            0
            экранирование идет по умолчанию то есть @: не нужен
            значение передается просто @Some.SomeMethod()
            есть синтаксис выражений типа @(Some.SomeMethod() + «SomeText»)
              0
              Я имел ввиду как реализован тег <%: %>
              В статье написано, что он автоматически декодирует вывод для предотвращения xss атак, но я не очень понял, что надо сделать, что бы он этого не делал, если есть такая потребность.
                0
                для получения значения откуда либо + он это значение декодирует
                для действий, например for или foreach
                можно написать так, но передаваемые значения надо декодировать всегда.
                  +1
                  Парсер лох сожрал все теги…
                    0
                    Написать как? Я прекрасно знаю, когда и что нужно декодировать. Я не понимаю как в разоре ему это указать, что бы вот тут он кодировал, а тут нет. Раньше были специальные теги. Сейчас же он там сам что-то решает.
                      0
                      если возвращаемое значение реализует интерфейс IHtmlString, то <%: не кодирует его. В разоре видимо тоже самое.
              0
              А что насчет подсветки синтаксиса? Как так удалось разукрасить скриншоты, если подсветки нет?
                  +1
                  Меню Tools -> Options -> Text Editor -> File Extension.
                  Вводим cshtml как Extension и выбираем HTML Editor в выпадающем списке. Жмём Add и OK.
                    –1
                    подсветка в статье из проекта WenMatrix, в нем подсветка для razor работает, но автодополнения тоже нет
                      0
                      * WebMatrix
                        0
                        Интересно какие файлы отвечают за подсветку, можно ли их скопировать туда.

                        Хотя тут уже предложили разукрасить это как html, вроде пока нормальное решение)
                          0
                          WebMatrix — это отдельная новая IDE и я сомневаюсь, что подсветку оттуда как-то можно перенести в VS2010
                            0
                            проще дождаться Preview 2, Скотт Гатри у себя в блоге пообещал, что поддержка синтаксиса будет во втором превью (и intellisense тоже)
                      0
                      Решено, с финальным выходом MVC 3 начну учить ASP, еще бы книгу хорошую подыскать.
                        0
                        А если технология интересует, то почему бы не начать уже сейчас?
                          0
                          Щас ковыряю XNA и Phone7
                        –1
                        Черт, красивый шаблонизатор. Жаль в фреймворках для сами-знаете-для-какого-языка нет подобного:(
                          –1
                          Эх, Razor, конечно, большой шаг (самое главное — убрали яркие, бросающиеся в глаза значки "%"), но по читабельности все равно еще далеко от Spark.
                            0
                            Согласен насчёт Spark, плюс могу себе представить ситации, когда он не найдёт по простому "}".
                              +1
                              погуглил про Spark… понравился :-)
                              особенно понравились if, each и подобные :-)
                                0
                                Spark — очень круто. Интересна его дальнейшая судьба, будет ли развиваться и насколько активно. С одной стороны, Lou (Louis DeJardin), создатель движка Spark, теперь работает на MS в команде ASP.NET (и возможно, в том числе, как-то влияет на разработку MVC, Razor, итд), и это вроде как гуд, но с другой — в каком приоритете теперь сам Spark?
                                  +2
                                  в идеале было бы добавить некоторые возможности (и наработки) и Spark в Razor
                                    –1
                                    у spark есть сообщество разработчиков, проект открытый, развиваться будет, хотя чему-там собственно особенно развиваться?
                                      +1
                                      Производительность у него, насколько я понял, чуток пониже, чем у WebFormsViewEngine, ну и может какие-то дополнительные прелести для него придумают. Забавно, кстати, зачем бы MS вообще создавать новый движок (Razor), а не взять Spark в качестве основного варианта в AspNetMvc.
                                        0
                                        Скотт Гатри писал по этому поводу. У Razor есть преимущество в расширяемости и некоторых других местах. Кроме того, MVC поддерживал и будет поддерживать Spark и NHaml, в MVC 3 даже ввели поддержку сторонних движков на уровне встраивания в Visual Studio 2010, так что используйте.
                                0
                                Издана книга: «ASP.NET MVC 3 Framework с примерами на C# 2010 для профессионалов», 3-е издание, Адам Фримен, Стивен Сандерсон, бумага офсетная-белая, твердый переплет, 672 стр., ISBN 978-5-8459-1758-4, «ВИЛЬЯМС», 2012

                                Книгу уже можно заказать-купить в ОЗОН.ru

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

                                Самое читаемое