Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом документе описываются новые функции и улучшения, появившиеся в ASP.NET MVC 2.
Введение
Обновление проекта ASP.NET MVC 1.0 до ASP.NET MVC 2
Новые функции
Шаблонные вспомогательные функции
Области
Поддержка асинхронных контроллеров
Поддержка DefaultValueAttribute в параметрах Action-Method
Поддержка привязки двоичных данных с помощью связывателей моделей
Классы ModelMetadata и ModelMetadataProvider
Поддержка атрибутов DataAnnotations
Поставщики проверяющего элемента управления модели
Проверка на стороне клиента
Новые фрагменты кода для Visual Studio 2010
Новый фильтр действий RequireHttpsAttribute
Переопределение команды метода HTTP
Новый класс HiddenInputAttribute для шаблонных вспомогательных приложений
Вспомогательный метод Html.ValidationSummary может отображать ошибки Model-Level
Шаблоны T4 в Visual Studio Создают код, относящееся к целевой версии платформа .NET FrameworkУлучшения API
Критические изменения
Заявление об отказе
Введение
ASP.NET MVC 2 основан на ASP.NET MVC 1.0 и предоставляет большой набор улучшений и функций, ориентированных на повышение производительности. Этот выпуск совместим с ASP.NET MVC 1.0, поэтому все ваши знания, навыки, код и расширения для ASP.NET MVC 1.0 продолжают применяться.
Дополнительные сведения о ASP.NET MVC см. в следующих ресурсах:
Обновление проекта ASP.NET MVC 1.0 до ASP.NET MVC 2
ASP.NET MVC 2 можно установить параллельно с ASP.NET MVC 1.0 на том же сервере, что позволяет разработчикам приложений выбирать, когда следует обновить приложение ASP.NET MVC 1.0 до ASP.NET MVC 2. Сведения об обновлении см. в документе Обновление приложения ASP.NET MVC 1.0 до ASP.NET MVC 2.
Новые возможности
В этом разделе описываются функции, появившиеся в выпуске MVC 2.
Шаблонные вспомогательные функции
Шаблонные вспомогательные функции позволяют автоматически связывать элементы HTML для редактирования и отображения с типами данных. Например, при отображении данных типа System.DateTime в представлении можно автоматически отобразить элемент пользовательского интерфейса средства выбора даты. Это аналогично работе шаблонов полей в ASP.NET динамических данных. Дополнительные сведения см. в статье Использование шаблонных вспомогательных средств для отображения данных на веб-сайте MSDN.
Области
Области позволяют организовать большой проект в несколько небольших разделов, чтобы управлять сложностью большого веб-приложения. Каждый раздел ("область") обычно представляет отдельный раздел большого веб-сайта и используется для группировки связанных наборов контроллеров и представлений. Дополнительные сведения см. в статье Пошаговое руководство. Организация ASP.NET приложения MVC по областям на веб-сайте MSDN.
Чтобы создать новую область, в Обозреватель решений щелкните правой кнопкой мыши проект, выберите добавить, а затем — Область. Откроется диалоговое окно с запросом на ввод имени области. После ввода имени области Visual Studio добавляет новую область в проект.
На следующем рисунке показан пример макета для проекта с двумя областями: Администратор и Блоги.
При создании области Visual Studio добавляет в каждую область класс, производный от AreaRegistration. Этот класс необходим для регистрации области и ее маршрутов, как показано в следующем примере:
namespace MyApplication.Areas.Blog {
public class BlogAreaRegistration : AreaRegistration {
public override string AreaName {
get { return "blog"; }
}
public override void RegisterArea(AreaRegistrationContext context) {
context.MapRoute(
"blog_default",
"blog/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
context.MapRoute(
"blog_whatsnew",
"whats-new",
new { action = "WhatsNew", id = UrlParameter.Optional }
);
}
}
}
Шаблон проекта по умолчанию для ASP.NET MVC 2 включает вызов метода RegisterAllAreas в коде для файла Global.asax. Этот метод регистрирует каждую область в проекте путем поиска всех типов, производных от класса AreaRegistration, создания экземпляра типа, а затем вызова метода RegisterArea в экземпляре . В следующем примере показано, как это сделать.
public class MyMvcApplication : HttpApplication {
void App_Start() {
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes) {
routes.MapRoute("default", "{controller}/{action}/{id}", ...);
}
}
Если пространство имен не указано в методе RegisterArea путем вызова контекста. Метод Namespaces.Add, пространство имен класса регистрации используется по умолчанию.
Поддержка асинхронных контроллеров
ASP.NET MVC 2 теперь позволяет контроллерам обрабатывать запросы асинхронно. Это может привести к повышению производительности, разрешив серверам, которые часто вызывают блокирующие операции (например, сетевые запросы), вызывать неблокирующие аналоги. Дополнительные сведения см. в статье Использование асинхронного контроллера в ASP.NET MVC на сайте MSDN.
Поддержка DefaultValueAttribute в параметрах Action-Method
Класс System.ComponentModel.DefaultValueAttribute позволяет задать значение по умолчанию для параметра аргумента методу действия. Например, предположим, что определен следующий маршрут по умолчанию:
{controller}/{action}/{id}
Также предположим, что определены следующие контроллер и метод действия:
public class ArticleController {
public ActionResult View(int id, [DefaultValue(1)]int page) {
}
}
Любой из следующих URL-адресов запроса вызовет метод действия View, определенный в предыдущем примере.
- /Article/View/123
- /Article/View/123?page=1 (фактически совпадает с предыдущим запросом)
- /Article/View/123?page=2
Без атрибута DefaultValueAttribute первый URL-адрес из предыдущего списка не будет работать, так как аргумент страницы является типом значения, не допускающего значения NULL, значение которого не указано.
Если код написан на Visual Basic 2010 или Visual C# 2010, можно использовать необязательные параметры вместо атрибута DefaultValueAttribute, как показано в следующем примере:
Function View(ByVal id As Integer, Optional ByVal page As Integer = 1) _
As ActionResult
' ...
End Function
public ActionResult MyAction(int id, int page = 1) {
// ...
}
Поддержка привязки двоичных данных с помощью связывателей моделей
Существует две новые перегрузки вспомогательной функции Html.Hidden, которые кодируют двоичные значения в виде строк в кодировке Base-64:
public static string Hidden(this HtmlHelper htmlHelper, string name, Binary value);
public static string Hidden(this HtmlHelper htmlHelper, string name, byte[] value);
Обычно используется внедрение метки времени для объекта в представление. Например, приложение может содержать следующий объект Product:
public class Product {
//... other properties ...
public byte[] TimeStamp {
get;
set;
}
}
Форма редактирования может отображать свойство TimeStamp в форме, как показано в следующем примере:
<%@ Page Inherits="ViewPage<Product>" %>
<%= Html.Hidden("TimeStamp", Model.TimeStamp) %>
Эта разметка отображает скрытый входной элемент со значением метки времени в виде строки в кодировке Base-64, которая похожа на следующий пример:
<input type="hidden" name="TimeStamp" value="QVNQLk5FVCBNVkMgaXMgZnVuIQ==" />
Эта форма может быть опубликована в методе действия с аргументом типа Product, как показано в следующем примере:
public ActionResult Edit(Product p) {
// p.TimeStamp is populated from the form
}
В методе action свойство TimeStamp заполняется правильно, так как опубликованная строка в кодировке base-64 преобразуется в массив байтов.
Классы ModelMetadata и ModelMetadataProvider
Класс ModelMetadataProvider предоставляет абстракцию для получения метаданных для модели в представлении. MVC 2 включает поставщик по умолчанию, который делает доступными метаданные, предоставляемые атрибутами в пространстве имен System.ComponentModel.DataAnnotations. Можно создать поставщиков метаданных, которые предоставляют метаданные из других хранилищ данных, таких как базы данных или XML-файлы.
Класс ViewDataDictionary предоставляет объект ModelMetadata, содержащий метаданные, извлеченные из модели классом ModelMetadataProvider. Это позволяет шаблонным вспомогательным приложениям использовать эти метаданные и соответствующим образом настраивать свои выходные данные.
Дополнительные сведения см. в документации по классам ModelMetadata и ModelMetadataProvider .
Поддержка атрибутов DataAnnotations
ASP.NET MVC 2 поддерживает использование атрибутов проверки RangeAttribute, RequiredAttribute, StringLengthAttribute и RegexAttribute (определенных в пространстве имен System.ComponentModel.DataAnnotations) при привязке к модели для обеспечения проверки входных данных.
Дополнительные сведения см. в разделе Практическое руководство. Проверка данных модели с помощью атрибутов DataAnnotations на веб-сайте MSDN. Пример проекта, иллюстрирующий использование этих атрибутов, доступен для скачивания по адресу https://go.microsoft.com/fwlink/?LinkId=157753.
Поставщики Model-Validator
Класс поставщика проверки модели представляет абстракцию, которая предоставляет логику проверки для модели. ASP.NET MVC включает поставщика по умолчанию на основе атрибутов проверки, включенных в пространство имен System.ComponentModel.DataAnnotations. Вы также можете создать собственные поставщики проверки, которые определяют настраиваемые правила проверки и настраиваемые сопоставления правил проверки с моделью. Дополнительные сведения см. в документации по классу ModelValidatorProvider .
Проверка Client-Side
Класс поставщика средства проверки модели предоставляет браузеру метаданные проверки в виде сериализованных данных JSON, которые могут использоваться клиентской библиотекой проверки. ASP.NET MVC 2 включает библиотеку проверки клиента и адаптер, который поддерживает атрибуты проверки пространства имен DataAnnotations, указанные ранее. Класс поставщика также позволяет использовать другие библиотеки проверки клиента, записывая адаптер, который обрабатывает данные JSON и вызывает в альтернативную библиотеку.
Новые фрагменты кода для Visual Studio 2010
Набор фрагментов кода HTML для ASP.NET MVC 2 устанавливается вместе с Visual Studio 2010. Чтобы просмотреть список этих фрагментов, в меню Сервис выберите Диспетчер фрагментов кода. Для языка выберите HTML, а в поле Расположение — ASP.NET MVC 2. Дополнительные сведения об использовании фрагментов кода см. в документации по Visual Studio.
Новый фильтр действий RequireHttpsAttribute
ASP.NET MVC 2 включает новый класс RequireHttpsAttribute, который можно применять к методам действий и контроллерам. По умолчанию фильтр перенаправляет запрос, отличный от SSL (HTTP), на эквивалент с поддержкой SSL (HTTPS).
Переопределение команды метода HTTP
При создании веб-сайта с использованием архитектурного стиля REST http-команды используются для определения того, какое действие следует выполнить с ресурсом. REST требует, чтобы приложения поддерживали полный спектр распространенных HTTP-команд, включая GET, PUT, POST и DELETE.
ASP.NET MVC 2 включает новые атрибуты, которые можно применять к методам действий и которые имеют компактный синтаксис. Эти атрибуты позволяют ASP.NET MVC выбирать метод действия на основе HTTP-команды. В следующем примере запрос POST вызывает первый метод действия, а запрос PUT вызывает второй метод действия.
[HttpPost]
public ActionResult Edit(int id)
[HttpPut]
public ActionResult Edit(int id, Tag tag)
В более ранних версиях ASP.NET MVC для этих методов действий требовался более подробный синтаксис, как показано в следующем примере:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id)
[AcceptVerbs(HttpVerbs.Put)]
public ActionResult Edit(int id, Tag tag)
Так как браузеры поддерживают только HTTP-команды GET и POST, невозможно выполнить публикацию в действии, требующее другой команды. Таким образом, невозможно изначально поддерживать все запросы RESTful.
Однако для поддержки запросов RESTful во время операций POST ASP.NET MVC 2 вводит новый вспомогательный метод HTML HttpMethodOverride. Этот метод отображает скрытый входной элемент, который заставляет форму эффективно эмулировать любой метод HTTP. Например, с помощью вспомогательного метода HTML HttpMethodOverride можно настроить отправку формы как запрос PUT или DELETE. Поведение HttpMethodOverride влияет на следующие атрибуты:
- HttpPostAttribute
- HttpPutAttribute
- HttpGetAttribute
- HttpDeleteAttribute
- AcceptVerbsAttribute
Скрытый входной элемент имеет имя X-HTTP-Method-Override, а для его значения задано http-команда для эмуляции. Значение переопределения также можно указать в заголовке HTTP или в значении строки запроса в виде пары "имя-значение".
Переопределение можно использовать только в том случае, если реальный запрос является запросом POST. Значение переопределения будет игнорироваться для запросов, использующих любую другую HTTP-команду.
Новый класс HiddenInputAttribute для шаблонных вспомогательных приложений
Новый атрибут HiddenInputAttribute можно применить к свойству модели, чтобы указать, следует ли отображать скрытый входной элемент при отображении модели в шаблоне редактора. (Атрибут задает неявное значение UIHint HiddenInput.) Свойство DisplayValue атрибута позволяет указать, отображается ли значение в режиме редактора и отображения. Если для DisplayValue задано значение false, ничего не отображается, даже html-разметка, которая обычно окружает поле. Значение по умолчанию для DisplayValue — true.
Атрибут HiddenInputAttribute можно использовать в следующих сценариях:
- Если представление позволяет пользователям изменять идентификатор объекта и необходимо отобразить значение, а также предоставить скрытый входной элемент, содержащий старый идентификатор, чтобы его можно было передать обратно контроллеру.
- Если представление позволяет пользователям изменять двоичное свойство, которое никогда не должно отображаться, например свойство метки времени. В этом случае значение и окружающая разметка HTML (например, метка и значение) не отображаются.
В следующем примере показано, как использовать класс HiddenInputAttribute.
public class ProductViewModel {
[HiddenInput] // equivalent to [HiddenInput(DisplayValue=true)]
public int Id { get; set; }
public string Name { get; set; }
[HiddenInput(DisplayValue=false)]
public byte[] TimeStamp { get; set; }
}
Если для атрибута задано значение true (или параметр не указан), происходит следующее:
- В шаблонах отображения отображается метка, а значение отображается пользователю.
- В шаблонах редактора отображается метка, а значение отображается в скрытом входном элементе.
Если для атрибута задано значение false, происходит следующее:
- В шаблонах отображения ничего не отображается для этого поля.
- В шаблонах редактора метка не отображается, а значение отображается в скрытом входном элементе.
Вспомогательный метод Html.ValidationSummary может отображать ошибки Model-Level
Вместо того, чтобы всегда отображать все ошибки проверки, вспомогательный метод Html.ValidationSummary имеет новый параметр для отображения только ошибок на уровне модели. Это позволяет отображать ошибки на уровне модели в сводке проверки, а ошибки, относящиеся к полям, — рядом с каждым полем.
Шаблоны T4 в Visual Studio Создание кода, относящееся к целевой версии платформа .NET Framework
Для файлов T4 из узла ASP.NET MVC T4 доступно новое свойство, указывающее версию платформа .NET Framework, используемую приложением. Это позволяет шаблонам T4 создавать код и разметку, относящиеся к версии платформа .NET Framework. В Visual Studio 2008 значением всегда является .NET 3.5. В Visual Studio 2010 значением является .NET 3.5 или .NET 4.
Улучшения API
В этом разделе описываются изменения в существующих типах и членах ASP.NET MVC.
- Добавлен защищенный виртуальный метод CreateActionInvoker в классе Controller. Этот метод вызывается свойством ActionInvoker контроллера и позволяет создавать отложенные экземпляры вызывающего средства, если средство вызова еще не задано.
- Добавлен защищенный виртуальный метод HandleUnauthorizedRequest в класс AuthorizeAttribute. Это позволяет фильтрам, производным от AuthorizeAttribute, управлять поведением при сбое авторизации.
- Добавлен метод Add(string key, object value) в класс ValueProviderDictionary. Это позволяет использовать синтаксис инициализатора словаря для ValueProviderDictionary, как показано в следующем примере:
Controller c = new MyController();
c.ValueProvider = new ValueProviderDictionary(null) {
{ "example1", "example1Value" },
{ "example2", "example2Value" },
{ "example3", new int[] { 1, 2, 3 } }
};
- Добавлен метод get_object в класс Sys.Mvc.AjaxContext. Это метод JavaScript, аналогичный методу get_data, но если тип содержимого ответа — application/json, get_object возвращает объект JSON.
- Добавлено свойство ActionDescriptor в класс AuthorizationContext.
- Добавлен маркер UrlParameter.Optional, который можно использовать для обхода проблем при привязке к модели, содержащей свойство ID, если свойство отсутствует в записи формы. Дополнительные сведения см. в записи ASP.NET MVC 2 Необязательные параметры URL-адреса в блоге Фила Хаака.
Критические изменения
Следующие изменения могут привести к ошибкам в существующих приложениях ASP.NET MVC 1.0.
Изменение поведения проверки свойств для классов, реализующих IDataErrorInfo
Для объектов модели, использующих IDataErrorInfo для выполнения проверки, проверяется каждое свойство независимо от того, было ли задано новое значение. В ASP.NET MVC 1.0 проверялись только свойства с новыми значениями. В ASP.NET MVC 2 свойство Error объекта IDataErrorInfo вызывается только в том случае, если все проверяющие элементы свойства были успешно выполнены.
Скрипт сопоставления сценариев IIS больше недоступен в установщике
Скрипт сопоставления сценариев IIS — это скрипт командной строки, который используется для настройки сопоставлений сценариев для IIS 6 и для IIS 7 в классическом режиме. Скрипт сопоставления скриптов не требуется при использовании сервера разработки Visual Studio или при использовании IIS 7 в интегрированном режиме. Скрипты доступны в виде отдельного неподдерживаемого скачивания на ASP.NET WebStack.
Вспомогательный метод Html.Substitute в MVC Futures больше недоступен
Из-за изменений в поведении отрисовки обработчиков представлений MVC вспомогательный метод Html.Substitute не работает и был удален.
Интерфейс IValueProvider заменяет все варианты использования IDictionary
Каждый аргумент свойства или метода, который принимал IDictionary в MVC 1.0, теперь принимает IValueProvider. Это изменение затрагивает только приложения, которые включают настраиваемые поставщики значений или пользовательские связыватели моделей. Ниже приведены примеры свойств и методов, на которые влияет это изменение.
- Свойство ValueProvider классов ControllerBase и ModelBindingContext.
- Методы TryUpdateModel класса Controller.
В файл Site.css добавлены новые классы CSS.
Файл Site.css в шаблонах проектов ASP.NET MVC был обновлен для включения новых стилей, используемых функциями проверки и шаблонными вспомогательными службами.
Вспомогательные функции теперь возвращают объект MvcHtmlString
Чтобы воспользоваться преимуществами нового синтаксиса выражений в кодировке HTML в ASP.NET 4, типом возвращаемого значения для вспомогательных средств HTML теперь является MvcHtmlString, а не строка. Если вы используете ASP.NET MVC 2 и новые вспомогательные функции в ASP.NET 3.5, вы не сможете воспользоваться синтаксисом кодирования HTML; Новый синтаксис доступен только при запуске ASP.NET MVC 2 в ASP.NET 4.
JsonResult теперь отвечает только на HTTP-запросы POST.
Чтобы предотвратить атаки с перехватом JSON, которые могут привести к раскрытию информации, по умолчанию класс JsonResult теперь отвечает только на HTTP-запросы POST. Вызовы Ajax GET методов действий, возвращающих объект JsonResult, следует изменить на использование POST. При необходимости это поведение можно переопределить, задав новое свойство JsonRequestBehavior объекта JsonResult. Дополнительные сведения о потенциальном эксплойтах см. в записи блога о перехвате JSON в блоге Фила Хаака.
Методы задания свойств Model и ModelType в ModelBindingContext устарели
В класс ModelBindingContext добавлено новое настраиваемое свойство ModelMetadata. Новое свойство инкапсулирует свойства Model и ModelType. Хотя свойства Model и ModelType устарели, для обратной совместимости методы получения свойств по-прежнему работают; они делегируют свойство ModelMetadata для получения значения.
Изменения класса DefaultControllerFactory нарушают пользовательские фабрики контроллеров, производные от него
Класс DefaultControllerFactory был исправлен путем удаления свойства RequestContext. Вместо этого свойства экземпляр контекста запроса передается защищенным виртуальным методам GetControllerInstance и GetControllerType. Это изменение влияет на фабрики пользовательских контроллеров, которые являются производными от DefaultControllerFactory.
Фабрики пользовательских контроллеров часто используются для внедрения зависимостей для ASP.NET приложений MVC. Чтобы обновить фабрики пользовательских контроллеров для поддержки ASP.NET MVC 2, измените подпись метода или подписи в соответствии с новыми подписями и используйте параметр контекста запроса вместо свойства .
"Область" теперь является зарезервированным ключом значения маршрута
Строка "область" в значениях маршрута теперь имеет особое значение в ASP.NET MVC, так же, как и "контроллер" и "действие". Одним из последствий является то, что если вспомогательные функции HTML предоставляются с словарем значений маршрута, содержащим слово "area", вспомогательные функции больше не будут добавлять слово "area" в строку запроса.
Если вы используете функцию Зоны, не используйте {area} как часть URL-адреса маршрута.
Отказ от ответственности
Это предварительный документ, он может быть существенно изменен до выхода окончательного коммерческого выпуска описанного здесь программного обеспечения.
Информация, содержащаяся в этом документе, являет собой текущее представление корпорации Майкрософт о вопросах, которые обсуждались на момент публикации. Поскольку корпорация Майкрософт должна реагировать на изменение рыночных условий, эта информация не должна рассматриваться как обязательство корпорации Майкрософт. Корпорация Майкрософт не может гарантировать достоверность информации, предоставленной после момента публикации.
Данный технический документ предназначен только для ознакомительных целей. МАЙКРОСОФТ НЕ ПРЕДОСТАВЛЯЕТ НИКАКИХ ГАРАНТИЙ, ЯВНЫХ ИЛИ ПРЕДУСМОТРЕННЫХ ЗАКОНОДАТЕЛЬСТВОМ, ОТНОСИТЕЛЬНО СВЕДЕНИЙ, СОДЕРЖАЩИХСЯ В ДАННОМ ДОКУМЕНТЕ.
Ответственность за соблюдение всех авторских прав и прав на интеллектуальную собственность целиком и полностью несет пользователь. Без ограничения авторских прав ни одна из частей этого документа не может быть воспроизведена, сохранена или использована в системах поиска либо передана в любой форме, любыми способами (электронными, механическими, в виде фотокопии, в виде записи или любыми другими) и для любых целей без письменного разрешения корпорации Майкрософт.
Корпорация Майкрософт может иметь патенты, патентные заявки, охраняемые товарные знаки, авторские или другие права на интеллектуальную собственность применительно к содержимому этого документа. Без письменного разрешения корпорации Майкрософт данный документ не дает лицензии на эти патенты, охраняемые товарные знаки, авторские права и другую интеллектуальную собственность.
Если не указано иное, примеры компаний, организаций, продуктов, доменных имен, адресов электронной почты, логотипов, людей, мест и событий, изображенных здесь, являются вымышленными, и никакой связи с какой-либо реальной компанией, организацией, продуктом, доменным именем, адресом электронной почты, логотипом, человеком, местом или событием не предполагается или не должно быть выведено.
© Корпорация Майкрософт, 2010 г. Все права защищены.
Microsoft и Windows являются охраняемыми товарными знаками корпорации Майкрософт в США и других странах.
Названия фактических компаний и продуктов, упомянутые здесь, могут являться охраняемыми товарными знаками соответствующих владельцев.