Создание шаблонов
Существует большая вероятность того, что один и тот же рендеринг одного и того же типа данных вам предстоит выполнить в разных представлениях. Для того чтобы поддержать такой сценарий, ASP.NET MVC предлагает разработчику создать один-единственный шаблон рендеринга типа данных, а затем использовать его во всех необходимых местах.
Для того чтобы создать шаблон представления типа данных, необходимо в папке нужного контроллера в папке представлений Views создать одну из папок: DisplayTemplates или EditorTemplates. DisplayTemplates должна содержать шаблоны для рендеринга представлений для просмотра, а EditorTemplates — для редактирования. Папки DisplayTemplates и EditorTemplates содержат частичные представления *.ascx, наименование которых соответствуют типам данных, с которыми необходимо работать.
Например, на рис. 9.8 в папке Views/Store представлена папка DisplayTemplates, которая содержит частичное представление Product.ascx. Это означает, что для рендеринга данных типа Product при работе в контроллере storeController будет использоваться шаблон Product.ascx.
Содержимое Product.ascx представлено в листинге 9.5.
Листинг 9.5. Содержимое Product.ascx
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<TemplatedHelpersProj ect.Models. Product>"
%>
<div>
<fieldset>
<legend>ИНформация</legend>
<dl>
<dt>
<%= Html.LabelFor(x => Model.Name) %>
</dt>
<dd>
<%= Html.DisplayFor(x => Model.Name) %>
</dd>
<dt>
<%= Html.LabelFor(x => Model.Cost) %>
</dt>
<dd>
<%= Html.DisplayFor(x => Model.Cost) %>
</dd>
<dt>
<%= Html.LabelFor(x => Model.Description) %>
</dt>
<dd>
<%= Html.DisplayFor(x => Model.Description) %>
</dd>
</dl>
</fieldset>
</div>
Как вы можете убедиться, шаблон Product.ascx соответствует той разметке, которую мы создавали для рендеринга в листинге 9.4. Однако если теперь модифицировать код листинга 9.4 до простого варианта <%= Html.DisplayFor (x => Model) %>, то результат останется неизменным, т. к. механизм ASP.NET MVC, обнаружив имеющийся шаблон Product.ascx, использует его для рендеринга представления модели с типом Product.
Аннотация данных и валидация
ASP.NET MVC 2 имеет поддержку валидации данных на основании аннотации с помощью атрибутов из пространства имен System.ComponentModel.DataAnnotations.
Давайте улучшим наше представление, внеся изменение в модель так, как показано в листинге 9.6.
Листинг 9.6. Модель данных с аннотациями
namespace TemplatedHelpersProj ect.Models
{
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
public class Product
{
[DisplayName("Идентификатор")]
[HiddenInput]
public int Id { get; set; }
[DisplayName("Наименование товара")]
[Required(ErrorMessage = "Не указано наименование")]
public string Name { get; set; }
[DisplayName("Описание")] public string Description { get; set; }
[DisplayName("Цена")]
[Required(ErrorMessage="He указана цена")]
public decimal Cost { get; set; }
[DisplayName("Дата обновления")]
[HiddenInput(DisplayValue=false)]
public DateTime UpdatedAt { get; set; }
}
}
Обратите внимание на используемые атрибуты из пространства имен System.ComponentModel.DataAnnotations. С помощью этих атрибутов модель данных помечается метаданными, которые в дальнейшем автоматически используются в разных частях программы. Для демонстрации этого использования рассмотрим новое представление Edit для контроллера StoreController, предназначенное для редактирования данных (листинг 9.7).
Листинг 9.7. Представление для редактирования данных модели типа Product
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<TemplatedHelpersProj ect.Models.Product> "
%>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent"
runat="server">
Редактирование информации
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent"
runat="server">
<h2>Товар</h2>
<%= Html.ValidationSummary() %>
<% using(Html.BeginForm()) {%>
<%= Html.EditorFor(x => Model) %>
<input type="submit" value="Обновить" />
<%} %>
</asp:Content>
Обратите внимание, в представлении используется шаблонный помощник Html.EditorFor, назначение которого — формировать разметку для редактирования, соответствующую модели.
В контроллере storeController добавим действия Edit (листинг 9.8).
Листинг 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).
Обратите внимание на то, что подписи к полям и сообщения об ошибках валидации соответствуют тем данным, которые были заведены нами через атрибуты аннотации данных. Кроме того, с помощью атрибута Hiddeninput нам удалось скрыть данные о времени обновления и изменить представление поля идентификатора с редактируемого поля на обычное текстовое поле.
Этот пример показывает, как использование атрибутов DisplayName, Hiddeninput, Required и др. из пространства имен System.Component-Model.DataAnnotations позволяет создать для модели набор метаданных, которые позже используются ASP.NET MVC для формирования разметки, подписей к полям ввода и валидации и вывода информации об ошибках.
Кроме поддержки валидации на сервере, ASP.NET MVC 2 предлагает поддержку валидации и на клиенте с помощью библиотеки валидации, написанной для jQuery. Для автоматической валидации данных на стороне клиента по умолчанию поддерживаются следующие атрибуты аннотирования данных: