Asp.net mvc framework
Шрифт:
? Html.LabelFor — производит рендеринг описательной информации для данных модели. По умолчанию выводит название поля модели;
? Html.DisplayFor — производит рендеринг значений данных модели в соответствии с их типом;
? Html.EditorFor — производит рендеринг элементов управления с данными модели для возможности редактирования.
Примечание
Кроме перечисленных стандартных методов расширения, в будущем планируется добавить методы: ValidationMessageFor, TextAreaFor, TextBoxFor, HiddenFor, DropDownListFor для соответствующей поддержки валидации и элементов управления в различных представлениях.
************************
Для всех этих методов расширения есть дополнительные методы LabelForModel, DisplayForModel и EditorForModel, которые являются сокращенным вариантом своих аналогов. Эти методы предназначены для рендеринга всей модели данных целиком без указания параметров.
Рассмотрим вариант рендеринга модели с помощью стандартных методов расширения. Для этого сформируем следующее представление (листинг 9.4).
Листинг 9.4. Модифицированное представление
<%@ 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">
Info
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent"
runat="server">
<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>
</asp:Content>
Результат работы данного кода представлен на рис. 9.7.
Обратите внимание, что с использованием методов Html.LabelFor и Html.EditorFor для каждого элемента модели мы получили возможность осуществлять рендеринг данных в таком виде, в котором нам бы этого хотелось. Вместо стандартной разметки с использованием <div>, которая производится при автоматическом рендеринге всей модели, мы использовали тег <dl> для представления только той ее части, которая нужна нам.
Создание шаблонов
Существует большая вероятность того, что один и тот же рендеринг одного и того же типа данных вам предстоит выполнить в разных представлениях. Для того чтобы поддержать такой сценарий, 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
{
Черный Рассвет
12. Морганвилльские вампиры
Фантастика:
ужасы и мистика
рейтинг книги
Эволюционер из трущоб. Том 10
10. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
рейтинг книги
Истребители. Трилогия
Фантастика:
альтернативная история
рейтинг книги
A Choriambic Progression
Юмор:
сатира
рейтинг книги