ASP.NET MVC 3 заметки о выпуске

Обзор

В этом документе описывается выпуск ASP.NET MVC 3 RTM для Visual Studio 2010. ASP.NET MVC — это платформа для разработки веб-приложений, использующих паттерн Model-View-Controller (MVC). Установщик ASP.NET MVC 3 включает следующие компоненты:

  • ASP.NET компоненты среды выполнения MVC 3
  • Средства ASP.NET MVC 3 для Visual Studio 2010
  • Компоненты времени выполнения ASP.NET Web Pages
  • Инструменты Visual Studio 2010 для веб-страниц ASP.NET
  • Microsoft Package Manager для .NET (NuGet)
  • Обновление для Visual Studio 2010, которое обеспечивает поддержку синтаксиса Razor. (Дополнительные сведения см. в статье базы знаний 2483190.)

Полный набор заметок о выпуске для каждой предварительной версии ASP.NET MVC 3 можно найти на веб-сайте ASP.NET по следующему URL-адресу:

https://www.asp.net/learn/whitepapers/mvc3-release-notes

Заметки о установке

Чтобы установить ASP.NET MVC 3 RTM с помощью установщика веб-платформы (web PI), посетите следующую страницу:

https://www.microsoft.com/en-us/download/details.aspx?id=4211

Кроме того, можно скачать установщик для ASP.NET MVC 3 RTM для Visual Studio 2010 на следующей странице:

https://go.microsoft.com/fwlink/?LinkID=208140

ASP.NET MVC 3 можно установить и запустить параллельно с ASP.NET MVC 2.

Требования к программному обеспечению

Для компонентов времени выполнения ASP.NET MVC 3 требуется следующее программное обеспечение:

  • .NET Framework версии 4.

    ASP.NET средства MVC 3 Visual Studio 2010 требуют следующего программного обеспечения:

  • Visual Studio 2010 или Visual Web Developer 2010 Express.

Документация

Документация по ASP.NET MVC доступна на веб-сайте MSDN по следующему URL-адресу:

https://go.microsoft.com/fwlink/?LinkId=205717

Руководства и другие сведения о ASP.NET MVC доступны на странице MVC веб-сайта ASP.NET по следующему URL-адресу:

https://www.asp.net/mvc/

Поддержка

Это полностью поддерживаемый выпуск. Сведения о получении технической поддержки можно найти на веб-сайте поддержки Майкрософт.

Кроме того, вы можете публиковать вопросы об этом выпуске на форуме ASP.NET MVC, где члены сообщества ASP.NET часто могут предоставлять неформальную поддержку:

https://forums.asp.net/1146.aspx

Обновление проекта ASP.NET MVC 2 до версии обновления средств ASP.NET MVC 3

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

Чтобы вручную обновить существующее приложение ASP.NET MVC 2 до версии 3, выполните следующие действия.

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

  2. Скопируйте следующие файлы из проекта ASP.NET MVC 3 в соответствующее расположение проекта ASP.NET MVC 2. Вам потребуется обновить все ссылки на библиотеку jQuery, чтобы учесть новое имя файла (jQuery-1.5.1.js):

    • /Views/Web.config
    • /packages.config
    • /scripts/*.js
    • /Content/темы/*.*
  3. Скопируйте папку пакетов в корне пустого решения проекта ASP.NET MVC 3 в корень решения, который находится в каталоге, где находится файл .sln решения.

  4. Если проект ASP.NET MVC 2 содержит все области, скопируйте файл /Views/Web.config в папку "Представления " каждой области.

  5. В обоих файлах Web.config в проекте ASP.NET MVC 2 осуществите поиск по всему проекту и замените версию ASP.NET MVC. Найдите следующее:

    System.Web.Mvc, Version=2.0.0.0
    

    Замените его следующим образом:

    System.Web.Mvc, Version=3.0.0.0
    
  6. В обозревателе решений удалите ссылку на System.Web.Mvc (которая указывает на библиотеку DLL версии 2), а затем добавьте ссылку на System.Web.Mvc (версии 3.0.0.0.0).

  7. Добавьте ссылку на System.Web.WebPages.dll и System.Web.Helpers.dll. Эти сборки находятся в следующих папках:

    • %ProgramFiles%\ Microsoft ASP.NET\ASP.NET MVC 3\Сборки
    • %ProgramFiles%\ Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Сборки
  8. В обозревателе решений щелкните правой кнопкой мыши имя проекта и выберите "Выгрузить проект". Затем снова щелкните правой кнопкой мыши имя проекта и выберите Edit ProjectName.csproj.

  9. Найдите элемент ProjectTypeGuids и замените {F85E285D-A4E0-4152-9332-AB1D724D3325} на {E53F8FEA-EAE0-44A6-8774-FFD645390401}.

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

  11. В корневом файле Web.config приложения добавьте следующие параметры в раздел сборок .

    <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, 
         PublicKeyToken=31BF3856AD364E35" />
    
    <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral,
         PublicKeyToken=31BF3856AD364E35" />
    
  12. Если проект ссылается на любые сторонние библиотеки, скомпилированные с помощью ASP.NET MVC 2, добавьте следующий выделенный элемент bindingRedirect в файл Web.config в корневом каталоге приложения в разделе конфигурации :

    <runtime>
       <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
           <assemblyIdentity name="System.Web.Mvc"
               publicKeyToken="31bf3856ad364e35"/>
           <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0"/>
         </dependentAssembly>
       </assemblyBinding>
    </runtime>
    

Изменения в обновлении средств MVC 3 ASP.NET

В этом разделе описываются изменения, внесенные в обновление средств ASP.NET MVC 3 Tools Update после выпуска ASP.NET MVC 3 RTM.

Диалоговое окно "Добавление контроллера" теперь может автоматически создавать структуры контроллеров с представлениями и кодом для доступа к данным.

Каркас — это способ быстрого создания контроллера и представлений для вашего приложения. После создания кода его можно изменить в соответствии с требованиями проекта.

Чтобы запустить диалоговое окно "Добавить контроллер" в ASP.NET MVC 3, щелкните правой кнопкой мыши папку "Контроллеры " в обозревателе решений, нажмите кнопку "Добавить" и нажмите кнопку "Контроллер". Диалоговое окно улучшено для предоставления дополнительных параметров формирования шаблонов.

Снимок экрана: диалоговое окно

По умолчанию доступны три шаблона каркаса.

Пустой контроллер

Этот шаблон создает пустой файл контроллера. Этот шаблон эквивалентен не проверке действий добавления для создания, редактирования, сведений, удаления сценариев в предыдущих версиях ASP.NET MVC. Если вы выберете это, дополнительные параметры недоступны.

Контроллер с пустыми действиями чтения и записи

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

Контроллер с действиями и представлениями чтения и записи с помощью Entity Framework

Этот шаблон позволяет быстро создать рабочий пользовательский интерфейс записи данных. Он создает код, который обрабатывает ряд распространенных требований и сценариев, таких как:

  • Доступ к данным. Созданный код считывает и записывает сущности в базу данных. Он работает с подходом Entity Framework Code First, если выбрать существующий класс контекста данных или позволить шаблону создать новый класс DbContext . Он также работает с подходом Database First или Model First Entity Framework, если выбрать существующий класс ObjectContext.

  • Проверка. Созданный код использует ASP.NET функции привязки модели MVC и метаданных, чтобы отправки форм проверялись в соответствии с правилами, объявленными в классе модели. Сюда входят встроенные правила проверки, такие как атрибуты Required и StringLength , а также пользовательские правила проверки.

  • Отношения "один ко многим". Если вы определяете связи внешнего ключа между классами моделей, созданный код создаст раскрывающиеся списки для выбора связанных сущностей. Например, можно определить классы моделей согласно соглашениям Entity Framework Code First:

    public class Product
    {
         public int ProductId { get; set; }
         [Required]
         public string Name { get; set; }
    
         // Product belongs to Category
         public int CategoryId { get; set; }
         public virtual Category Category { get; set; }
    }
    public class Category
    {
         public int CategoryId { get; set; }
         [Required]
         public string Name { get; set; }
    }
    

    После этого вы создадите шаблон контроллера для класса Product , его представления позволят пользователям выбирать объект Category для каждого экземпляра Product .

    Этот шаблон включает дополнительные параметры в диалоговом окне "Добавить контроллер ". Для класса Model можно выбрать любой класс модели в решении, который определяет тип данных, которые пользователи смогут создавать или изменять:

  • Если вы хотите использовать Entity Framework Code First, можно выбрать любой класс модели.

  • Если вы используете entity Framework Database First или Entity Framework Model First, обязательно выберите класс сущностей, определенный в концептуальной модели.

Для класса Контекста данных можно выбрать следующие варианты:

  • Если вы хотите использовать Code First и не имеет существующего класса контекста данных, выберите **Новый контекст данных ***. Затем будет создан класс контекста данных.
  • Если вы хотите использовать Code First и иметь существующий класс контекста данных, выберите его здесь. Оно будет обновлено, чтобы сохранить выбранный класс модели.
  • Если вы используете базу данных First или Model First, выберите здесь класс контекста объекта.

Для представлений выберите подсистему представления, которую вы хотите использовать, или выберите "Нет", если вы не хотите создавать шаблон представлений.

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

Улучшения диалогового окна "ASP.NET MVC 3 Новый проект"

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

Снимок экрана: диалоговое окно нового проекта. Выделен значок приложения интрасети и флажок

Новый шаблон "Проект интрасети"

Список шаблонов проекта содержит новый шаблон приложения интрасети. Этот шаблон содержит параметры для создания веб-приложения с помощью проверки подлинности Windows вместо проверки подлинности форм. Так как приложению интрасети требуются некоторые параметры IIS, которые не могут быть инкапсулированы в шаблоне проекта, шаблон содержит файл readme с инструкциями по созданию шаблона проекта в IIS. Документация по новому шаблону приложения интрасети доступна на веб-сайте MSDN по следующему URL-адресу:

https://msdn.microsoft.com/library/gg703322(VS.98).aspx

Шаблоны проектов теперь поддерживают HTML5

Диалоговое окно "Новый проект" теперь содержит параметр для добавления функций, относящихся к HTML5, в шаблоны проектов. Выбор параметра приводит к созданию представлений, содержащих новые элементы HTML5 <header>, <footer> и <navigation>.

Обратите внимание, что более ранние версии браузеров не поддерживают теги, относящиеся к HTML5. Чтобы устранить это ограничение, шаблоны проектов HTML5 включают ссылку на библиотеку модернизатора. (См. следующий раздел.)

Теперь шаблоны проектов включают Modernizr 1.7

Modernizr — это библиотека JavaScript, которая позволяет поддерживать CSS 3 и HTML5 в браузерах, которые еще не поддерживают эти функции. Эта библиотека входит в состав предварительно установленного пакета NuGet в шаблонах для ASP.NET проектов MVC 3. Дополнительные сведения о Modernizr см. в http://www.modernizr.com/.

Шаблоны проектов включают обновленные версии jQuery, пользовательского интерфейса jQuery и jQuery Validation

Теперь шаблоны проектов включают следующие версии скриптов jQuery:

  • jQuery 1.5.1
  • Проверка jQuery 1.8
  • Пользовательский интерфейс jQuery 1.8.11

Эти библиотеки включены в качестве предварительно установленных пакетов NuGet.

Шаблоны проектов теперь включают ADO.NET Entity Framework 4.1 в качестве предварительно установленного пакета NuGet

В ADO.NET Entity Framework 4.1 включена функция Code First. Code First — это новый шаблон разработки для платформы Entity Framework ADO.NET, который предоставляет альтернативу существующим шаблонам Database First и Model First.

Code First ориентирован на определение модели с помощью классов POCO ("простых старых объектов CLR"), написанных в Visual Basic или C#. Затем эти классы можно сопоставить с существующей базой данных или использовать для создания схемы базы данных. Дополнительную конфигурацию можно указать с помощью атрибутов DataAnnotations или с помощью интерфейсов API fluent.

Документация по использованию Code Firstwith ASP.NET MVC доступна на веб-сайте ASP.NET по следующим URL-адресам:

https://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part1-cs https://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

Шаблоны проектов включают библиотеки JavaScript в качестве предварительно установленных пакетов NuGet

При создании нового проекта ASP.NET MVC 3 проект включает в себя файлы JavaScript, упомянутые ранее (например, библиотека модернизатора), устанавливая их с помощью NuGet вместо непосредственного добавления скриптов в папку "Скрипты" в содержимом шаблона проекта. Это позволяет использовать NuGet для обновления скриптов до последней версии при выпуске новых версий скриптов.

Например, учитывая частоту новых выпусков jQuery, версия jQuery, включенная в шаблон проекта, будет в какой-то момент устарела. Однако так как jQuery включен в качестве установленного пакета NuGet, вы получите уведомление в диалоговом окне NuGet, когда доступны более новые версии jQuery.

Так как jQuery содержит номер версии в имени файла, обновление jQuery до последней версии также требует обновления <script> тега, ссылающегося на файл jQuery, чтобы использовать новое имя файла. Другие включенные библиотеки скриптов не включают номер версии в имя скрипта, поэтому их можно легко обновить до последних версий.

Известные проблемы в ASP.NET MVC 3

  • В некоторых случаях установка может завершиться ошибкой с сообщением об ошибке "Сбой установки с кодом ошибки (0x80070643)". Сведения о том, как обойти эту проблему, см. в статье базы знаний 2531566.
  • Каркас для добавления контроллера не создает шаблоны для сущностей, которые используют наследование в Entity Framework. Например, учитывая базовый класс Person , унаследованный классом Student , формирование шаблонов класса Student приведет к созданию кода, который не компилируется.
  • Создание нового проекта ASP.NET MVC 3 в папке решения приводит к ошибке NullReferenceException . Обходной путь — создать проект ASP.NET MVC 3 в корне решения, а затем переместить его в папку решения.
  • Синтаксис IntelliSense для Razor не работает при установке ReSharper. Если вы установили ReSharper и хотите воспользоваться поддержкой Razor IntelliSense в ASP.NET MVC 3, ознакомьтесь с записью Razor Intellisense и ReSharper в блоге Hadi Hariri, который обсуждает способы их совместного использования сегодня.
  • Во время установки диалоговое окно принятия EULA отображает условия лицензионного соглашения в окне, которое меньше предполагаемого.
  • При редактировании представления Razor (.cshtml или .vbhtml-файл). ASP.NET MVC 3 не содержит фрагменты кода для представлений Razor. При выборе фрагмента кода для ASP.NET MVC будут отображаться фрагменты кода для.
  • Если вы устанавливаете ASP.NET MVC 3 для Visual Web Developer Express на компьютере, где Visual Studio не установлен, а затем установите Visual Studio, необходимо переустановить ASP.NET MVC 3. Компоненты Visual Studio и Visual Web Developer Express, которые используются совместно и обновляются установщиком ASP.NET MVC 3. Эта же проблема применяется, если установить ASP.NET MVC 3 для Visual Studio на компьютере, который не содержит Visual Web Developer Express, а затем установить Visual Web Developer Express.

Изменения в ASP.NET MVC 3 RTM

В этом разделе описываются изменения и исправления ошибок, внесенные в выпуск ASP.NET е MVC 3 RTM с момента выпуска RC2.

Изменение: обновлена версия пользовательского интерфейса jQuery до версии 1.8.7

Шаблоны проектов MVC ASP.NET для Visual Studio были обновлены, чтобы включить последнюю версию библиотеки пользовательского интерфейса jQuery. Шаблоны также включают минимальный набор файлов ресурсов, необходимых для пользовательского интерфейса jQuery, таких как связанные ФАЙЛЫ CSS и изображения.

Изменено значение ModelMetadataProvider снова на DataAnnotationsModelMetadataProvider.

Выпуск RC2 ASP.NET MVC 3 представил класс CachedDataAnnotationsMetadataProvider , который предоставил кэширование поверх существующего класса DataAnnotationsModelMetadataProvider в качестве улучшения производительности. Однако были сообщены некоторые сбои с этой реализацией, поэтому изменение было отменено и перемещено в проект MVC Futures, который доступен в ASP.NET WebStack.

Исправлено. Вставка части выражения Razor, содержащего пробелы, приводит к его инверсии.

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

@SomeMethod("first param",
100)
@AnotherMethod()

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

@AnotherMethod(param""first)

Правильное поведение заключается в том, что операция вставки должна привести к следующему:

@AnotherMethod("first param")

Эта проблема устранена в выпуске RTM, чтобы выражение правильно сохранялось во время операции вставки.

Исправлено. Переименование файла Razor, открываемого в редакторе, отключает цветовую фильтрацию синтаксиса и IntelliSense

Переименование файла Razor с помощью обозревателя решений во время открытия файла в окне редактора приводит к тому, что выделение синтаксиса и IntelliSense перестают работать с этим файлом. Это исправлено, чтобы выделение и IntelliSense сохранялись после переименования.

Известные проблемы для ASP.NET MVC 3 RTM

  • Если вы закройте бета-версию Visual Studio 2010 с пакетом обновления 1 (SP1) во время открытия консоли диспетчера пакетов NuGet, Visual Studio завершает работу и пытается перезапустить. Это будет исправлено в окончательном выпуске (RTM) Visual Studio 2010 с пакетом обновления 1 (SP1).
  • Установщик ASP.NET MVC 3 может установить только начальную версию диспетчера пакетов NuGet. После установки начальной версии NuGet можно установить и обновить с помощью диспетчера расширений Visual Studio. Если вы уже установили NuGet, перейдите в коллекцию расширений Visual Studio, чтобы обновить до последней версии NuGet.
  • Создание нового проекта ASP.NET MVC 3 в папке решения приводит к ошибке NullReferenceException . Обходной путь — создать проект ASP.NET MVC 3 в корне решения, а затем переместить его в папку решения.
  • Установщик может занять гораздо больше времени, чем предыдущие версии ASP.NET MVC. Это связано с тем, что он обновляет компоненты Visual Studio 2010.
  • Синтаксис IntelliSense для Razor не работает при установке ReSharper. Если вы установили ReSharper и хотите воспользоваться поддержкой Razor IntelliSense в ASP.NET MVC 3, ознакомьтесь с записью Razor Intellisense и ReSharper в блоге Hadi Hariri, который обсуждает способы их совместного использования сегодня.
  • Представления CCSHTML и VBHTML, созданные с бета-версией ASP.NET MVC 3, не имеют правильного набора действий сборки, поэтому при публикации проекта эти типы представлений опущены. Значение действия сборки для этих файлов должно быть установлено как "Content". ASP.NET MVC 3 RTM исправляет эту проблему для новых файлов, но не исправляет параметры существующих файлов для проекта, созданного с предварительной версией.
  • Снимок экрана: диалоговое окно свойств с открытым меню действия сборки. Выбран параметр содержимого.
  • Во время установки диалоговое окно принятия EULA отображает условия лицензионного соглашения в окне, которое меньше предполагаемого.
  • При редактировании представления Razor (CSHTML-файл) элемент меню "Перейти к контроллеру" в Visual Studio не будет доступен, и фрагменты кода отсутствуют.
  • Если вы устанавливаете ASP.NET MVC 3 для Visual Web Developer Express на компьютере, где Visual Studio не установлен, а затем установите Visual Studio, необходимо переустановить ASP.NET MVC 3. Компоненты Visual Studio и Visual Web Developer Express, которые используются совместно и обновляются установщиком ASP.NET MVC 3. Эта же проблема применяется, если установить ASP.NET MVC 3 для Visual Studio на компьютере, который не содержит Visual Web Developer Express, а затем установить Visual Web Developer Express.

Критические изменения в ASP.NET MVC 3

  • В предыдущих версиях ASP.NET MVC фильтры действий создаются для каждого запроса, за исключением нескольких случаев. Это поведение никогда не было гарантированным поведением, а лишь подробной реализацией и контрактом для фильтров было рассматривать их без отслеживания состояния. В ASP.NET MVC 3 фильтры кэшируются более агрессивно. Поэтому любые фильтры пользовательских действий, которые неправильно хранят состояние экземпляра, могут перестать работать.
  • Порядок выполнения фильтров исключений изменился для фильтров исключений с одинаковым значением Order . В ASP.NET MVC 2 и более ранних версий фильтры исключений на контроллере, которые имеют то же значение Order , что и в методе действия, выполняются перед фильтрами исключений в методе действия. Обычно это может быть так, если фильтры исключений применяются без указанного значения порядка . В ASP.NET MVC 3 этот порядок был отменен таким образом, чтобы самый конкретный обработчик исключений выполнялся первым. Как и в предыдущих версиях, если свойство Order явно указано, фильтры выполняются в указанном порядке.
  • Новое свойство FileExtensions было добавлено в базовый класс VirtualPathProviderViewEngine . Если ASP.NET ищет представление по пути (а не по имени), рассматриваются только представления с расширением файла, содержащимся в списке, указанном этим новым свойством. Это критическое изменение в приложениях, в которых зарегистрирован настраиваемый поставщик сборки для поддержки пользовательского расширения файлов для представлений Web Forms, и где поставщик ссылается на эти представления, используя полный путь, а не имя. Обходной путь — изменить значение свойства FileExtensions , чтобы включить пользовательское расширение файла.
  • Реализации фабрики пользовательских контроллеров, которые непосредственно реализуют интерфейс IControllerFactory, должны реализовать новый метод GetControllerSessionBehavior, добавленный в интерфейс в этом релизе. Как правило, рекомендуется не реализовать этот интерфейс напрямую и вместо этого наследить класс из DefaultControllerFactory.

Изменения в ASP.NET MVC 3 RC2

В этом разделе описываются изменения (новые функции и исправления ошибок), внесенные в выпуск ASP.NET MVC 3 RC2 с момента выпуска RC.

Шаблоны проектов изменены на включение jQuery 1.4.4, jQuery Validation 1.7 и jQuery UI 1.8.6

Шаблоны проектов для ASP.NET MVC 3 теперь включают последние версии jQuery, jQuery Validation и jQuery UI. Пользовательский интерфейс jQuery является новым дополнением к шаблонам проектов и предоставляет полезные мини-приложения пользовательского интерфейса. Дополнительные сведения о пользовательском интерфейсе jQuery см. на домашней странице: http://jqueryui.com/

Добавлен класс AdditionalMetadataAttribute

Класс AdditionalMetadataAttribute можно использовать для заполнения словаря ModelMetadata.AdditionalValues для свойства модели.

Например, предположим, что модель представления имеет свойства, которые должны отображаться только администратору. Эта модель может быть аннотирована новым атрибутом с помощью AdminOnly в качестве ключа и true в качестве значения, как показано в следующем примере:

public class ProductViewModel {
    [AdditionalMetadata("AdminOnly", true)]
    public string RefundCode {get; set;}
}

Эти метаданные предоставляются любому шаблону отображения или редактора при отображении модели представления продукта. Разработчик приложений сам интерпретирует метаданные.

Улучшенная настройка шаблонов представления

Шаблоны T4, используемые для формирования представлений, теперь создают вызовы методов-помощников шаблона, таких как EditorFor, а не вспомогательных элементов, таких как TextBoxFor. Это изменение улучшает поддержку метаданных в модели в виде атрибутов аннотации данных, когда диалоговое окно "Добавить Представление" создает представление.

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

Шаблоны редактирования и создания по умолчанию включают ссылки на скрипты jQuery, необходимые для проверки клиента.

Добавлен метод Html.Raw

По умолчанию модуль представления Razor HTML-кодирует все значения. Например, следующий фрагмент кода кодирует HTML внутри переменной приветствия, чтобы он отображался на странице как <strong>Hello World!</strong>.

@{
  string greeting = "<strong>Hello World!</strong>";
}

<p>@greeting</p>

Новый метод Html.Raw предоставляет простой способ отображения незакодированного HTML-кода, когда содержимое, как известно, является безопасным. В следующем примере отображается та же строка, но строка отображается как разметка:

@{
  string greeting = "<strong>Hello World!</strong>";
}

<p>@Html.Raw(greeting)</p>

Переименованы свойства Controller.ViewModel и View в ViewBag.

Ранее свойство ViewModelконтроллера соответствовало свойству View представления. Оба этих свойства предоставляют способ доступа к значениям объекта ViewDataDictionary с помощью синтаксиса динамического метода доступа к свойствам. Оба свойства были переименованы в одно и то же, чтобы избежать путаницы и быть более согласованными.

Переименован класс ControllerSessionStateAttribute в SessionStateAttribute.

Класс ControllerSessionStateAttribute был представлен в выпуске RC ASP.NET MVC 3. Свойство было переименовано, чтобы быть более кратким.

Переименовано свойство RemoteAttribute "Fields" в "AdditionalFields"

Свойство Fields класса RemoteAttribute вызвало некоторую путаницу среди пользователей. Переименование этого свойства в AdditionalFields объясняет свое намерение.

Переименовано "SkipRequestValidationAttribute" на "AllowHtmlAttribute".

Атрибут SkipRequestValidationAttribute был переименован в AllowHtmlAttribute , чтобы лучше представить его предполагаемое использование.

Изменен метод Html.ValidationMessage, чтобы отобразить первое полезное сообщение об ошибке

Метод Html.ValidationMessage был исправлен, чтобы отобразить первое полезное сообщение об ошибке вместо простого отображения первой ошибки.

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

Если метод Html.ValidationMessage отображает сообщение проверки, он пропускает записи состояния модели, которые включают исключение, так как они обычно не предназначены для конечного пользователя. Вместо этого метод ищет первое сообщение проверки, которое не связано с исключением и отображает это сообщение. Если такое сообщение не найдено, по умолчанию используется универсальное сообщение об ошибке, связанное с первым исключением.

Исправлено @model объявление, чтобы не добавлять пробелы в документ

В предыдущих выпусках объявление @model в начале представления добавляло пустую строку к выходным HTML данным. Это исправлено так, чтобы декларация не вводила пробелы.

Добавлено свойство FileExtensions для просмотра обработчиков для поддержки имен файлов Engine-Specific

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

return View("~/views/home/index.cshtml");

Первый обработчик представлений всегда пытается отобразить представление. По умолчанию подсистема представления веб-форм является первой подсистемой представлений; Так как подсистема веб-форм не может отобразить представление Razor, возникает ошибка. Теперь подсистемы просмотра имеют свойство FileExtensions , которое используется для указания расширений файлов, которые они поддерживают. Это свойство проверяется, когда ASP.NET определяет, может ли обработчик представлений отображать файл. Это критическое изменение и дополнительные сведения включены в раздел критических изменений в этом документе.

Исправлена вспомогательная функция LabelFor, чтобы сгенерировать правильное значение для атрибута "For"

Исправлена ошибка, из-за которой метод LabelFor отрисовал атрибут for, который соответствует атрибуту имени элемента input вместо его идентификатора. Согласно W3C, атрибут for должен соответствовать идентификатору элемента поле ввода.

Исправлен метод RenderAction для придания приоритета явным значениям во время привязки модели.

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

Критические изменения в ASP.NET MVC 3 RC2

  • В предыдущих версиях ASP.NET MVC фильтры действий были созданы для каждого запроса, за исключением нескольких случаев. Это поведение никогда не было гарантированным поведением, а лишь подробной реализацией и контрактом для фильтров было рассматривать их без отслеживания состояния. В ASP.NET MVC 3 фильтры кэшируются более агрессивно. Поэтому любые фильтры пользовательских действий, которые неправильно хранят состояние экземпляра, могут перестать работать.
  • Порядок выполнения фильтров исключений изменился для фильтров исключений с одинаковым значением Order . В ASP.NET MVC 2 и более ранних версий фильтры исключений на контроллере с тем же значением order , что и в методе действия, выполнялись до фильтров исключений в методе действия. Обычно это происходит при применении фильтров исключений без указанного значения заказа . В ASP.NET MVC 3 этот порядок был отменен таким образом, чтобы самый конкретный обработчик исключений выполнялся первым. Как и в предыдущих версиях, если свойство Order явно указано, фильтры выполняются в указанном порядке.
  • Новое свойство FileExtensions было добавлено в базовый класс VirtualPathProviderViewEngine . Если ASP.NET ищет представление по пути (а не по имени), рассматриваются только представления с расширением файла, содержащимся в списке, указанном этим новым свойством. Это критическое изменение в приложениях, в которых зарегистрирован настраиваемый поставщик сборки для поддержки пользовательского расширения файлов для представлений Web Forms, и где поставщик ссылается на эти представления, используя полный путь, а не имя. Обходной путь — изменить значение свойства FileExtensions , чтобы включить пользовательское расширение файла.
  • Реализации фабрики пользовательских контроллеров, которые непосредственно реализуют интерфейс IControllerFactory, должны реализовать новый метод GetControllerSessionBehavior, добавленный в интерфейс в этом релизе. Как правило, рекомендуется не реализовать этот интерфейс напрямую и вместо этого наследить класс из DefaultControllerFactory.

Известные проблемы в ASP.NET MVC 3 RC2

  • Установщик ASP.NET MVC 3 может установить только начальную версию диспетчера пакетов NuGet. После установки начальной версии NuGet можно установить и обновить с помощью диспетчера расширений Visual Studio. Если вы уже установили NuGet, перейдите в коллекцию расширений Visual Studio, чтобы обновить до последней версии NuGet.
  • Создание нового проекта ASP.NET MVC 3 в папке решения приводит к ошибке NullReferenceException . Обходной путь — создать проект ASP.NET MVC 3 в корне решения, а затем переместить его в папку решения.
  • Установщик может занять гораздо больше времени, чем предыдущие версии ASP.NET MVC. Это связано с тем, что он обновляет компоненты Visual Studio 2010.
  • Синтаксис IntelliSense для Razor не работает при установке ReSharper. Если вы установили ReSharper и хотите воспользоваться поддержкой Razor IntelliSense в ASP.NET MVC 3 RC2, ознакомьтесь с записью Razor Intellisense и ReSharper в блоге Hadi Hariri, который обсуждает способы их совместного использования сегодня.
  • Представления CSHTML и VBHTML, созданные с бета-версией ASP.NET MVC 3, не имеют правильного набора действий сборки, при этом при публикации проекта эти типы представлений опущены. Значение действия сборки для этих файлов должно иметь значение Content. ASP.NET MVC 3 RC2 исправляет эту проблему для новых файлов, но не исправляет параметры существующих файлов для проекта, созданного с бета-версией. Снимок экрана: диалоговое окно свойств. Откроется меню действий сборки и выбран параметр содержимого.
  • Во время установки диалоговое окно принятия EULA отображает условия лицензионного соглашения в окне, которое меньше предполагаемого.
  • При редактировании представления Razor (CSHTML-файл) элемент меню "Перейти к контроллеру" в Visual Studio не будет доступен, и фрагменты кода отсутствуют.
  • Если вы устанавливаете ASP.NET MVC 3 для Visual Web Developer Express на компьютере, где Visual Studio не установлен, а затем установите Visual Studio, необходимо переустановить ASP.NET MVC 3. Компоненты Visual Studio и Visual Web Developer Express, которые используются совместно и обновляются установщиком ASP.NET MVC 3. Эта же проблема применяется, если установить ASP.NET MVC 3 для Visual Studio на компьютере, который не содержит Visual Web Developer Express, а затем установить Visual Web Developer Express.
  • Установка ASP.NET MVC 3 RC 2 не обновляет NuGet, если она уже установлена. Чтобы обновить NuGet, перейдите в диспетчер расширений Visual Studio, и он должен отображаться в качестве доступного обновления. Вы можете обновить NuGet до последнего выпуска.

Кандидат в релизы ASP.NET MVC 3

ASP.NET MVC Release Candidate был выпущен 9 ноября 2010 года.

Новые возможности в ASP.NET MVC 3 RC

В этом разделе описаны функции, которые были внедрены в выпуске кандидат версии MVC 3 ASP.NET после бета-версии.

Диспетчер пакетов NuGet

ASP.NET MVC 3 включает диспетчер пакетов NuGet (ранее известный как NuPack), который является интегрированным средством управления пакетами для добавления библиотек и инструментов в проекты Visual Studio. Это средство автоматизирует шаги, которые разработчики принимают сегодня, чтобы получить библиотеку в исходном дереве.

Вы можете работать с NuGet в качестве средства командной строки в виде интегрированного окна консоли в Visual Studio 2010, в контекстном меню Visual Studio и в виде набора командлетов PowerShell.

Дополнительные сведения о NuGet см. в документации по Nuget.

Улучшенное диалоговое окно "Новый проект"

При создании проекта диалоговое окно "Новый проект" теперь позволяет указать обработчик представлений, а также тип проекта MVC ASP.NET.

На экране: диалоговое окно нового проекта. Открыто меню движка представлений, и выбран Razor.

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

Шаблоны по умолчанию приведены ниже.

Empty. Содержит минимальный набор файлов для проекта ASP.NET MVC, включая структуру каталогов по умолчанию для проектов MVC ASP.NET MVC, файл ASP.NET Site.css, содержащий стили MVC по умолчанию и каталог скриптов, содержащий файлы JavaScript по умолчанию.

Интернет-приложение. Содержит пример функциональных возможностей, демонстрирующих использование поставщика членства с ASP.NET MVC.

Список шаблонов проектов, отображаемых в диалоговом окне, указан в реестре Windows.

Контроллеры без сеансов

Новый ControllerSessionStateAttribute позволяет вам более точно контролировать поведение состояния сеанса контроллеров, задавая значение перечисления System.Web.SessionState.SessionStateBehavior.

В следующем примере показано, как отключить состояние сеанса для всех запросов к контроллеру.

[ControllerSessionState(SessionStateBehavior.Disabled)]
public class CoolController : Controller {
    public ActionResult Index() {
        object o = Session["Key"]; // Causes an exception.

    }
}

В следующем примере показано, как задать состояние сеанса только для чтения для всех запросов к контроллеру.

[ControllerSessionState(SessionStateBehavior.ReadOnly)]
public class CoolController : Controller {
    public ActionResult Index() {
    Session["Key"] = "value"; // Value is not available in
    the next request
    }
}

Новые атрибуты проверки

CompareAttribute

Новый атрибут проверки CompareAttribute позволяет сравнить значения двух различных свойств модели. В следующем примере свойство ComparePassword должно соответствовать полю password , чтобы быть допустимым.

public class User {
    [Required]

    public string Password { get; set; }
    [Required, Compare("Password")]
    public string ComparePassword { get; set; }
}

RemoteAttribute

Новый атрибут проверки RemoteAttribute использует удаленный проверяющий модуль проверки jQuery, который позволяет клиентской проверке вызывать метод на сервере, который выполняет фактическую логику проверки.

В следующем примере свойство UserName имеет примененное свойство RemoteAttribute . При редактировании этого свойства в представлении "Изменение" проверка клиента вызовет действие с именем 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";
    }
}

По умолчанию имя свойства, к которому применяется атрибут, отправляется методу действия в качестве параметра строки запроса.

Новые перегрузки для методов LabelFor и LabelForModel

Добавлены новые перегрузки для методов LabelFor и LabelForModel , которые позволяют указать текст метки. В следующем примере показано, как использовать эти перегрузки.

@Html.LabelFor(m => m.PropertyName,
"Label Text");
@Html.LabelForModel("Label Text");

Кэширование выходных данных дочернего действия

OutputCacheAttribute поддерживает кэширование выходных данных дочерних действий, вызываемых с помощью вспомогательных методов Html.RenderAction или Html.Action. В следующем примере показано представление, которое вызывает другое действие.

Hi there. The uncached time is:
@DateTime.Now
The cached time is: @Html.Action("GetDate")

Действие GetDate аннотируется с помощью OutputCacheAttribute:

[OutputCache(Duration = 100,
VaryByParam = "none")]
public string GetDate() {
    return DateTime.Now.ToString();
}

При выполнении этого кода результат вызова Html.Action (GetDate) кэшируется в течение 100 секунд.

Улучшения диалогового окна "Создать представление"

При добавлении строго типизированного представления диалоговое окно "Добавление представления" теперь фильтрует больше неприменимых типов, чем в предыдущих выпусках, например, многие основные типы .NET Framework. Кроме того, список теперь отсортирован по имени класса, а не по полному имени типа, что упрощает поиск типов. Например, имя типа теперь отображается, как показано в следующем примере:

ClassName (пространство имен)

В предыдущих выпусках это будет отображаться следующим образом:

Namespace.ClassName

Детализированная проверка запросов

Свойство Exclude объекта ValidateInputAttribute больше не существует. Вместо этого, чтобы пропустить проверку запроса для определенных свойств модели во время привязки модели, используйте новый SkipRequestValidationAttribute.

Например, предположим, что метод действия используется для редактирования записи блога:

[HttpPost]
public ActionResult Edit(BlogPostViewModel post) {
    // Save the post in the database
}

В следующем примере показана модель представления для публикации в блоге.

public class BlogPostViewModel {
    public int Id {get; set;}

    public string Subject {get; set;}

    public string Description {get; set;}
}

Когда пользователь отправляет некоторую разметку для свойства Description, привязка модели завершится ошибкой из-за проверки запроса. Чтобы отключить проверку запросов во время привязки модели для поля Description записи блога, примените атрибут SkipRequestValidationAttribute к свойству, как показано в этом примере:.

public class BlogPostViewModel {
    public int Id {get; set;}

    public string Subject {get; set;}

    [SkipRequestValidation]

    public string Description {get; set;}
}

Кроме того, чтобы отключить проверку запроса для каждого свойства модели, примените атрибут ValidateInputAttribute со значением false к методу действия.

[HttpPost]
[ValidateInput(false)]
public ActionResult Edit(BlogPostViewModel post) {
    // Save the post in the database
}

Критические изменения, вызывающие несовместимость, в релиз-кандидате ASP.NET MVC 3

  • Порядок выполнения фильтров исключений изменился для фильтров исключений с одинаковым значением Order . В ASP.NET MVC 2 и более ранних версий фильтры исключений на контроллере с тем же порядком , что и в методе действия, выполнялись до фильтров исключений в методе действия. Обычно это происходит при применении фильтров исключений без указанного значения заказа . В ASP.NET MVC 3 этот порядок был отменен таким образом, чтобы самый конкретный обработчик исключений выполнялся первым. Как и в предыдущих версиях, если свойство Order явно указано, фильтры выполняются в указанном порядке.
  • Добавлено новое свойство FileExtensions в базовый класс VirtualPathProviderViewEngine . При поиске представления по пути (и не по имени) рассматриваются только представления с расширением файла, содержащимся в списке, указанном этим новым свойством. Это критическое изменение для тех, кто регистрирует поставщика настраиваемой сборки для поддержки настраиваемого расширения файла для представлений веб-форм и кто ссылается на эти представления, используя полный путь, а не имя. Обходной путь — изменить значение свойства FileExtensions , чтобы включить пользовательское расширение файла.

Известные проблемы в ASP.NET MVC 3 RC

  • Установщик может занять гораздо больше времени, чем предыдущие версии ASP.NET MVC, так как он обновляет компоненты Visual Studio 2010.
  • Добавление шаблона представления при выборе строго типизированного представления генерирует шаблоны для свойств только для записи. Их всегда следует игнорировать при использовании технологии scaffolding. Диалоговое окно "Добавить представление" также автоматически добавляет свойства только для чтения при создании представлений "Изменение" или "Создание". Свойства, доступные только для чтения, должны генерироваться только для представлений 'Отображение' и 'Список'.
  • Отладка не работает, если ASP.NET MVC 3 устанавливается вместе с Async CTP. ASP.NET MVC 3 нельзя установить параллельно с Async CTP. Удалите Async CTP для восстановления отладки. Дополнительные сведения см. в этой записи блога об удалении всех частей ASP.NET MVC 3 RC.
  • Razor Intellisense не работает при установке Resharper. Если вы установили ReSharper и хотите воспользоваться поддержкой Razor intellisense в ASP.NET MVC 3 RC, ознакомьтесь с этой записью блога из JetBrains, которая обсуждает способы их совместного использования сегодня.
  • Представления CSHTML и VBHTML, созданные с помощью бета-версии ASP.NET MVC 3, не имеют правильно установленного действия сборки, из-за чего они не публикуются. Действие сборки для этих файлов должно быть установлено как "Content". ASP.NET MVC 3 RC исправляет эту проблему для новых файлов, но не корректирует настройки для существующих файлов в проекте, созданном на основе бета-версии.
  • Установщик может занять гораздо больше времени, чем предыдущие версии ASP.NET MVC, так как он обновляет компоненты Visual Studio 2010.
  • При выборе строго типизированного представления шаблонов представления "Добавить представление" при выборе строго типизированных шаблонов представления считываются только свойства. Аналогичным образом свойства, доступные только для записи, являются шаблонами для представлений Display.
  • Во время установки диалоговое окно принятия EULA отображает условия лицензионного соглашения в окне, которое меньше предполагаемого.
  • Установка Visual Studio Async CTP вызывает конфликт с версией Razor, включенной в состав установки инструментов ASP.NET MVC 3. Убедитесь, что вы не пытаетесь установить как Visual Studio Async CTP, так и выпуск Razor на одном компьютере.
  • При редактировании представления Razor (CSHTML-файл) элемент меню "Перейти к контроллеру" в Visual Studio не будет доступен, и фрагменты кода отсутствуют.

Бета-версия ASP.NET MVC 3

ASP.NET бета-версия MVC 3 была выпущена 6 октября 2010 года. Приведенные ниже заметки относятся к бета-версии и подлежат любым обновлениям или изменениям, упомянутым в разделе о кандидате на релиз ASP.NET MVC 3 выше.

Новые возможности в бета-версии ASP.NET MVC 3

В этом разделе описываются функции, появившиеся в выпуске ASP.NET MVC 3 Beta.

Диспетчер пакетов NuGet

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

Вы можете работать с NuGet в качестве средства командной строки в виде интегрированного окна консоли в Visual Studio 2010, в контекстном меню Visual Studio и в виде набора командлетов PowerShell.

Дополнительные сведения о NuGet см. в документации по NuGet.

Диалоговое окно "Улучшенный новый проект"

При создании проекта диалоговое окно "Новый проект" теперь позволяет указать обработчик представлений, а также тип проекта MVC ASP.NET.

Снимок экрана диалогового окна нового проекта. Razor выбран в меню движка представления.

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

Шаблоны по умолчанию приведены ниже.

Empty. Содержит минимальный набор файлов для проекта ASP.NET MVC, включая структуру каталогов по умолчанию для проектов MVC ASP.NET MVC, небольшой файл ASP.NET Site.css, содержащий стили MVC по умолчанию и каталог скриптов, содержащий файлы JavaScript по умолчанию.

Интернет-приложение. Содержит пример функциональных возможностей, демонстрирующих использование поставщика членства в ASP.NET MVC.

Простой способ задавать строго типизированные модели в представлениях Razor.

Способ указания типа модели для строго типизированных представлений Razor был упрощен с помощью новой @model директивы для представлений CSHTML и @ModelType директивы для представлений VBHTML. В более ранних версиях ASP.NET MVC можно указать строго типизированную модель для представлений Razor следующим образом:

@inherits System.Web.Mvc.WebViewPage

В этом выпуске можно использовать следующий синтаксис:

@model MyModelNamespace.MyModelType

Поддержка новых вспомогательных методов веб-страниц ASP.NET

Новая технология веб-страниц ASP.NET включает набор вспомогательных методов, которые полезны для добавления часто используемых функций в представления и контроллеры. ASP.NET MVC 3 поддерживает использование этих вспомогательных методов в контроллерах и представлениях (в случае необходимости). Эти методы содержатся в сборке System.Web.Helpers. В следующей таблице перечислены несколько вспомогательных методов веб-страниц ASP.NET.

Помощник Описание
Диаграмма Отрисовывает диаграмму в представлении. Содержит такие методы, как Chart.ToWebImage, Chart.Save и Chart.Write.
Крипто Использует алгоритмы хэширования для создания соленых и хэшированных паролей.
Webgrid Отрисовывает коллекцию объектов (обычно данные из базы данных) в виде сетки. Поддерживает разбиение по страницам и сортировку.
WebImage Отрисовывает изображение.
Вебмейл Отправляет сообщение электронной почты.

Краткий справочный раздел, который содержит вспомогательные функции и базовый синтаксис, доступен в рамках документации по синтаксису Razor ASP.NET по следующему URL-адресу:

https://www.asp.net/webmatrix/tutorials/asp-net-web-pages-api-reference

Дополнительная поддержка DI (внедрение зависимостей)

На основе выпуска ASP.NET MVC 3 preview 1 текущий выпуск включает в себя добавленную поддержку двух новых служб и четырех существующих служб, а также улучшена поддержка разрешения зависимостей и указателя Common Service.

Новый интерфейс IControllerActivator для детализированного создания объектов контроллера

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

namespace System.Web.Mvc {
    using System.Web.Routing;

    public interface IControllerActivator {
        IController Create(RequestContext requestContext, Type controllerType);
    }
}

Сравните это с ролью фабрики контроллеров. Фабрика контроллеров — это реализация интерфейса IControllerFactory, который отвечает как за поиск типа контроллера, так и для создания экземпляра этого типа контроллера.

Активаторы контроллера отвечают только за создание экземпляра типа контроллера. Они не выполняют поиск типа контроллера. После нахождения соответствующего типа контроллера фабрики контроллеров должны передать создание экземпляра контроллера экземпляру IControllerActivator.

Класс DefaultControllerFactory имеет новый конструктор, который принимает экземпляр IControllerFactory. Это позволяет применять внедрение зависимостей для управления этим аспектом процесса создания контроллера без необходимости переопределения поведения поиска типа контроллера по умолчанию.

Интерфейс IServiceLocator заменен на IDependencyResolver

На основе отзывов сообщества ASP.NET бета-версия MVC 3 заменила использование интерфейса IServiceLocator тонким интерфейсом IDependencyResolver, характерным для потребностей ASP.NET MVC. В следующем примере показан новый интерфейс:

namespace System.Web.Mvc {
    using System.Collections.Generic;

    public interface IDependencyResolver {
        object GetService(Type serviceType);
        IEnumerable<object> GetServices(Type serviceType);
    }
}

В рамках этого изменения класс ServiceLocator также был заменен классом DependencyResolver. Регистрация сопоставителя зависимостей аналогична более ранним версиям ASP.NET MVC:

DependencyResolver.SetResolver(myResolver);

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

Если зарегистрированные службы запрошенного типа отсутствуют, ASP.NET MVC ожидает реализации этого интерфейса возвращать значение NULL из GetService и возвращать пустую коллекцию из GetServices.

Новый класс DependencyResolver позволяет регистрировать классы, реализующие новый интерфейс IDependencyResolver или интерфейс Locator Common Service (IServiceLocator). Дополнительные сведения о Common Service Locator см. в CommonServiceLocator на сайте GitHub.

Новый интерфейс IViewActivator для тонкой настройки создания экземпляров страниц просмотра.

Новый интерфейс IViewPageActivator обеспечивает более точное управление тем, как страницы представления создаются с помощью внедрения зависимостей. Это относится как к экземплярам WebFormView, так и к экземплярам RazorView. В следующем примере показан новый интерфейс:

namespace System.Web.Mvc {
    public interface IViewPageActivator {
        object Create(ControllerContext controllerContext, Type type);
    }
}

Теперь эти классы принимают аргумент конструктора IViewPageActivator, который позволяет использовать внедрение зависимостей для контролирования создания экземпляров типов ViewPage, ViewUserControl и WebViewPage.

Поддержка нового сопоставителя зависимостей для существующих служб

Новый выпуск включает поддержку разрешения зависимостей для следующих служб:

  • Поставщики проверки модели. Классы, реализующие ModelValidatorProvider, могут быть зарегистрированы в сопоставителе зависимостей, и система будет использовать их для поддержки проверки на стороне клиента и сервера.
  • Поставщик метаданных модели. Один класс, реализующий ModelMetadataProvider, можно зарегистрировать в сопоставителе зависимостей, и система будет использовать его для предоставления метаданных для систем шаблонов и проверок.
  • Поставщики значений. Классы, реализующие ValueProviderFactory, могут быть зарегистрированы в сопоставителе зависимостей, и система будет использовать их для создания поставщиков значений, используемых контроллером во время привязки модели.
  • Связыватели моделей. Классы, реализующие IModelBinderProvider, могут быть зарегистрированы в сопоставителе зависимостей, и система будет использовать их для создания привязок моделей, используемых системой привязки модели.

Поддержка ненавязчивого Ajax на основе jQuery

ASP.NET MVC включает вспомогательные методы Ajax, такие как следующие:

  • Ajax.ActionLink
  • Ajax.RouteLink
  • Ajax.BeginForm
  • Ajax.BeginRouteForm

Эти методы используют JavaScript для вызова метода действия на сервере вместо использования полной обратной передачи. Эта функция была обновлена, чтобы воспользоваться преимуществами jQuery в ненавязчивой манере. Вместо того чтобы навязчиво выдавать встроенные клиентские скрипты, эти вспомогательные методы отделяют поведение от разметки путем создания атрибутов HTML5 с помощью префикса data-ajax . Затем поведение применяется к разметке, ссылаясь на соответствующие файлы JavaScript. Убедитесь, что на следующие файлы JavaScript ссылаются:

  • jquery-1.4.1.js
  • jquery.unobtrusive.ajax.js

Эта функция включена по умолчанию в файле Web.config в новом шаблоне проектов MVC 3 ASP.NET, но по умолчанию отключена для существующих проектов. Дополнительные сведения см. в разделе "Добавленные флаги на уровне приложений" для проверки клиента и ненавязчивого JavaScript далее в этом документе.

Новая поддержка ненавязчивой проверки jQuery

По умолчанию ASP.NET MVC 3 Beta использует проверку jQuery ненавязчивым способом для выполнения проверки на стороне клиента. Чтобы включить ненавязчивую клиентскую проверку данных, выполните вызов примерно следующим образом в представлении:

Html.EnableClientValidation();

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

Html.EnableUnobtrusiveJavaScript();

Кроме того, убедитесь, что на указанные ниже файлы JavaScript ссылаются.

  • jquery-1.4.1.js
  • jquery.validate.js
  • jquery.validate.unobtrusive.js

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

Новые флаги для проверки данных клиента и ненавязчивого JavaScript в масштабах приложения.

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

HtmlHelper.ClientValidationEnabled = true;
HtmlHelper.UnobtrusiveJavaScriptEnabled = true;

Шаблоны проектов по умолчанию позволяют включить ненавязчивый JavaScript по умолчанию. Вы также можете включить или отключить эти функции в корневом Web.config файле приложения с помощью следующих параметров:

<configuration>
        <appSettings>
            <add key="ClientValidationEnabled" value="true"/>
            <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
        </appSettings>
    </configuration>

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

public void EnableClientValidation();
public void EnableClientValidation(bool enabled);
public void EnableUnobtrusiveJavaScript();
public void EnableUnobtrusiveJavaScript(bool enabled);

Для обратной совместимости обе эти функции отключены по умолчанию.

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

Теперь вы можете поместить файл с именем _viewstart.cshtml (или _viewstart.vbhtml) в каталог Views и добавить в него код, который будет использоваться для нескольких представлений в этом каталоге и его подкаталогах. Например, можно поместить следующий код на страницу _viewstart.cshtml в папке ~/Views:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Это задает страницу макета для каждого представления в папке Views и всех ее вложенных папок рекурсивно. При отрисовке представления код в файле _viewstart.cshtml выполняется перед запуском кода представления. Код _viewstart.cshtml применяется к каждому представлению в этой папке.

По умолчанию код в файле _viewstart.cshtml также применяется к представлениям в любой вложенной папке. Однако отдельные вложенные папки могут иметь собственную версию файла _viewstart.cshtml; В этом случае локальная версия имеет приоритет. Например, чтобы запустить код, общий для всех представлений HomeController, поместите файл _viewstart.cshtml в папку ~/Views/Home.

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

Предыдущая ASP.NET предварительная версия MVC включала поддержку представлений с использованием синтаксиса Razor на основе C#. Эти представления используют файл с расширением .cshtml. В рамках текущей работы по поддержке Razor, ASP.NET MVC 3 Beta предоставляет поддержку синтаксиса Razor в Visual Basic, который использует расширение .vbhtml-файла.

Общие сведения об использовании синтаксиса Visual Basic на страницах VBHTML см. в руководстве по следующему URL-адресу:

https://www.asp.net/webmatrix/tutorials/asp-net-web-pages-visual-basic

Более детализированный контроль над атрибутом ValidateInputAttribute

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

[ValidateInput(false)]
public ActionResult SomeAction() {
    return View();
}

Однако многие веб-приложения имеют отдельные поля формы, которые должны разрешать HTML, в то время как остальные поля не должны. Класс ValidateInputAttribute теперь позволяет указать список полей, которые не должны быть включены в проверку запроса.

Например, если вы разрабатываете подсистему блога, может потребоваться разрешить разметку в полях "Текст" и "Сводка". Эти поля могут представляться двумя входными элементами, каждый из которых имеет атрибут имени, соответствующий имени свойства (Body и Summary). Чтобы отключить проверку запросов только для этих полей, укажите имена (разделенные запятыми) в свойстве Exclude класса ValidateInput, как показано в следующем примере:

[ValidateInput(true, Exclude="Body, Summary")]
public ActionResult About() {
    return View();
}

Вспомогательные функции преобразуют символы подчеркивания в дефисы для имен атрибутов HTML, указанных с помощью анонимных объектов

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

Html.TextBox("Name", "Value", new {title = "Title"})

Этот подход не позволяет использовать дефисы в имени атрибута, так как дефис нельзя использовать для имени свойства в ASP.NET. Однако дефисы важны для пользовательских атрибутов HTML5; например, HTML5 использует префикс data-.

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

Html.TextBox("Name", "Value", new {data_required = "true"})

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

<input data-required="true" id="Name" name="Name"
       type="textbox" value="Value" />

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

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

Теперь клиентская валидация поддерживает проверку переопределенных свойств, имеющих атрибуты валидации.

JsonValueProviderFactory теперь зарегистрирован по умолчанию.

Разрушающие изменения

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

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

Во время установки диалоговое окно принятия EULA отображает условия лицензионного соглашения в окне, которое меньше предполагаемого.

Представления Razor не поддерживают IntelliSense и не выделяют синтаксис. Ожидается, что поддержка синтаксиса Razor в Visual Studio будет включена в состав более поздней версии.

При редактировании представления Razor (CSHTML-файла) пункт меню "Перейти к контроллеру" в Visual Studio не будет доступен, и фрагменты кода отсутствуют.

При использовании синтаксиса @model для указания представления CSHTML строго типизированного языковые сокращения для типов не распознаются. Например, @model int не будет работать, но @model Int32 будет работать. Решение этой ошибки заключается в использовании фактического имени типа при указании типа модели.

При использовании @model синтаксиса для указания строго типизированного представления CSHTML (или @ModelType указания строго типизированного представления VBHTML), типы и объявления массивов, допускающие значение NULL, не поддерживаются. Например, @model int? не поддерживается. Вместо этого используйте @model Nullable<Int32>. Строка синтаксиса @model [] также не поддерживается; вместо этого используйте @model IList<string>.

При обновлении проекта ASP.NET MVC 2 до ASP.NET MVC 3 обязательно добавьте в раздел appSettings файла Web.config следующее:

<appSettings>
  <add key="enableSimpleMembership" value="false" />
</appSettings>

Существует известная проблема, которая приводит к тому, что проверка подлинности форм всегда перенаправляет пользователей без проверки подлинности в ~/Account/Login, игнорируя параметр проверки подлинности форм, используемый в Web.config. Обходной путь — добавить следующий параметр приложения.

<add key="autoFormsAuthentication" value="false" />

Отказ от ответственности

© Корпорация Майкрософт 2011 г. Все права защищены. Этот документ предоставляется как есть. Сведения и представления, выраженные в этом документе, включая URL-адрес и другие ссылки на веб-сайт Интернета, могут изменяться без уведомления. Вы берете на себя все риски, связанные с использованием сведений, приводящихся в данном документе.

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