Литмир - Электронная Библиотека

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 или параметров строки запроса.

Следует учесть, что перегрузка запросов возможна только для POST-запросов. Во всех других случаях скрытый параметр X-HTTP-Method-Override игнорируется.

DefauItValueAttribute

С помощью атрибута System.ComponentModel.DefaultValueAttribute в MVC 2 становится возможным указывать значения по умолчанию для параметров действий.

public class ArticleController

{

  public ActionResult View(int id, [DefaultValue(1)]int page)

  {

  }

}

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

RequireHttpsAttribute

Новый атрибут RequireHttpsAttribute в MVC 2 позволит вам пометить действия, вызов которых должен быть произведен только по защищенному протоколу HTTPS.

Улучшения в связывании данных

ASP.NET MVC 2 предоставит новую возможность по связыванию данных. Теперь в MVC 2 связывание данных возможно и с бинарными типами данных, представленными byte[] и System.Data.Linq.Binary. Для этих целей введены два новых перегруженных метода расширения Hidden:

public static string Hidden(this HtmlHelper htmlHelper, string name, Binary value);

public static string Hidden(this HtmlHelper htmlHelper, string name, byte[] value);

После использования этих методов для бинарных данных в разметке будет произведен рендеринг скрытого элемента hidden со строкой данных, закодированной по base-64. После отправки запроса с формы, которая содержит данный скрытый элемент, его данные будут декодированы и связаны с соответствующим значением модели.

70
{"b":"971383","o":1}