Asp.net mvc framework
Шрифт:
Листинг 9.8. Действия Edit
public ActionResult Edit
{
var product = new Product {
ost = 1,
Description = "Описание",
Id = 1,
Name = "Товар",
UpdatedAt = DateTime.Now };
return View(product);
}
[HttpPost]
public ActionResult Edit(Product product)
{
return View(product);
}
Теперь, запустив приложение на выполнение, перейдя на Store/Edit и пробуя обновить данные без указания некоторых полей, мы получим такую картину (рис. 9.9).
Обратите
Этот пример показывает, как использование атрибутов DisplayName, Hiddeninput, Required и др. из пространства имен System.Component-Model.DataAnnotations позволяет создать для модели набор метаданных, которые позже используются ASP.NET MVC для формирования разметки, подписей к полям ввода и валидации и вывода информации об ошибках.
Кроме поддержки валидации на сервере, ASP.NET MVC 2 предлагает поддержку валидации и на клиенте с помощью библиотеки валидации, написанной для jQuery. Для автоматической валидации данных на стороне клиента по умолчанию поддерживаются следующие атрибуты аннотирования данных:
StringLengthAttribute, RequiredAttribute, RegexAttribute, RangeAttribute.
Для включения клиентской валидации необходимо добавить на страницу следующий код, подключить скрипты:
<script type="text/javascript" src="MicrosoftAj ax.js"></script>
<script type="text/javascript" src="MicrosoftMvcAj ax.js"></script>
и для формы указать на необходимость использования клиентской валидации
<% using(Html.BeginForm) { %>
//...
<% Html.EnableClientValidation; %>
<% } %>
Кроме того, финальный вариант ASP.NET MVC 2 будет поддерживать новый механизм адаптеров, который позволит вам написать свой собственный провайдер клиентской валидации.
Классы метаданных
Существуют сценарии, когда аннотирование классов не представляется возможным, например, когда класс является автогенерируемым классом контекста данных Linq To Sql. Кроме того, вероятны сценарии, когда получение данных аннотации необходимо производить не с помощью атрибутов System.ComponentModel.DataAnnotations, а из других источников: базы данных или файлов XML.
Для поддержки таких сценариев в ASP.NET MVC введен механизм классов метаданных. Класс метаданных представляет собой обычный класс, служащий только для одной цели — предоставлять дополнительные данные — метаданные — о другом классе. Для примера добавим к нашему классу Product класс с метаданными, вынеся все данные аннотации в метакласс (листинг 9.9).
Листинг 9.9. Класс с метаданными для класса Product
namespace TemplatedHelpersProject.Models {
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
[MetadataType (typeof (ProductMetadata)) ]
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Cost { get; set; }
public DateTime UpdatedAt { get; set; }
}
public class ProductMetadata
{
[DisplayName("Идентификатор")]
[HiddenInput]
public int Id { get; set; }
[DisplayName("Наименование
товара")][Required(ErrorMessage = "Не указано наименование")]
public string Name { get; set; }
[DisplayName("Описание")]
public string Description { get; set; }
[DisplayName("Цена")]
[Required(ErrorMessage="Не указана цена")]
public decimal Cost { get; set; }
[DisplayName("Дата обновления")]
[HiddenInput(DisplayValue=false)]
public DateTime UpdatedAt { get; set; }
}
}
Обратите внимание на выделенную строку [MetadataType(typeof (ProductMetadata))]. Атрибут MetadataType используется для того, чтобы показать механизму ASP.NET MVC, в каком классе следует искать метаданные. После выполнения кода мы убедимся, что перемещение метаданных из класса Product в класс ProductMetadata никак не отразилось на результате. Данные метаинформации стали потребляться из класса ProductMetadata, что и требовалось достичь.
Новые атрибуты
ASP.NET MVС 2 представляет набор новых атрибутов для разнообразных сфер применения. Далее вы найдете более полное описание.
Http***Attribute и перегрузка типов запросов
Ранее в ASP.NET MVC для ограничения выполнения действия в ответ на тип запроса применялся атрибут AcceptverbsAttribute с параметрами из перечисления HttpVerbs. В ASP.NET MVC 2 представлены альтернативные атрибуты для короткой записи: HttpPostAttribute, HttpPutAttribute, HttpGetAttribute, HttpDeleteAttribute.
Кроме атрибутов сокращенной формы, ASP.NET MVC 2 предлагает еще один механизм работы с запросами, который нацелен на REST-сценарии. При работе с REST-приложениями важной задачей ставится правильное оперирование типами запросов. Однако не все браузеры поддерживают типы запросов типа PUT или DELETE. Для преодоления этой проблемы в MVC 2 вводится новый метод расширения Html.HttpMethodOverride, который используется для перегрузки типа запроса, применяемого на форме. Например, в следующем коде формируется POST-форма (по умолчанию) с перегрузкой параметра запроса в PUT с помощью Html.HttpMethodOverride:
<% using(Html.BeginForm) {%>
<%= Html.HttpMethodDverride(HttpVerbs.Put) %>
<%} %>
Этот механизм работает следующим образом: вызов Html.HttpMethodOverride формирует на форме следующее скрытое поле:
<input name="X-HTTP-Method-Override" type="hidden" value="PUT" />
При получении запроса с формы ASP.NET MVC ищет скрытое поле со значением X-HTTP-Method-Override и, если оно найдено, предполагает, что запрос представляет собой тип, указанный в скрытом поле. Таким образом, указанный ранее пример вызовет действие, помеченное атрибутом HttpPut, но не HttpPost, т. к. форма содержит перегруженный тип запроса. Перегрузка значения может выполняться не только с помощью скрытого поля, но и с помощью заголовков HTTP или параметров строки запроса.