ЖАНРЫ

Шрифт:

</fieldset>

<% } %>

<div>

<%=Html.ActionLink("K списку товаров", "Index") %>

</div>

</asp:Content>

В листинге 5.8 методы Html.ValidationMessage вызываются co вторым строковым параметром, указывающим сообщение, которое должно быть отображено пользователю в случае наличия ошибки в коллекции ModelState. В результате форма, заполненная с ошибками, будет выглядеть так, как показано на рис. 5.2.

Для того чтобы сообщение об ошибке было выведено непосредственно в месте вызова метода Html.ValidationMessage, метод нужно вызывать

без указания второго параметра Html.ValidationMessage("UnitPrice"). Результат приведен на рис. 5.3.

Стоит отметить, что если в коде представления не используется строготипизированная привязка к свойствам модели, то привязка к данным осуществляется автоматически, и в этом случае при возникновении ошибок нет необходимости передавать объект модели представлению через метод View, как это было сделано в листинге 5.7. То есть фрагмент кода из листинга 5.7 может быть написан так, как указано далее. Листинг 5.9 демонстрирует код представления, не использующего привязку к свойствам объекта модели Model.

if (IModelState.IsValid)

{

// есть ошибки, еще раз

// показать форму редактирования

return View;

}

Листинг 5.9. Представление Edit.aspx без привязки к свойствам объекта Model

<%@ Page Title="" Language="C#"

MasterPageFile="~/Views/Shared/Site.Master"

Inherits="System.Web.Mvc.ViewPage<MvcViewsDemo.Models.Product>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">

Edit

</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>

Редактирование сведений о товаре

</h2>

<%= Html.ValidationSummary("при редактировании сведений

о товаре произошли ошибки.") %>

<% using (Html.BeginForm)

{%>

<fieldset>

<legend>Редактирование сведений о товаре</legend>

<label for="ProductID">

Код продукта:

</label>

<%= ViewData.Eval("ProductID") %>

<%= Html.Hidden("ProductID")%>

<label for="ProductName">

Название:

</label>

<%= Html.TextBox("ProductName") %>

<%= Html.ValidationMessage("ProductName") %>

<label for="UnitPrice">

Цена:

</label>

<%= Html.TextBox("UnitPrice") %>

<%= Html.ValidationMessage("UnitPrice") %>

<label for="UnitsInStock">

На складе:

</label>

<%= Html.TextBox("UnitsInStock") %>

<%= Html.ValidationMessage("UnitsInStock") %>

<label for="UnitsOnOrder">

Заказано:

</label>

<%= Html.TextBox("UnitsOnOrder") %>

<%= Html.ValidationMessage("UnitsOnOrder") %>

<input type="submit" value="Save" />

</fieldset>

<% } %>

<div>

<%=Html.ActionLink("K

списку товаров", "Index") %>

</div>

</asp:Content>

Примечание

Важно обратить внимание, что при использовании кода, аналогичного приведенному в листинге 5.9, поиск значений элементов формы будет осуществляться через ViewData.Eval, и значение ViewData["SomeProperty"] имеет больший приоритет, чем ViewData.Model.SomeProperty. Поэтому, во избежание трудноуловимых ошибок, при создании кода контроллера стоит с особенной тщательностью относиться к тому, как передаются данные — через свойства объекта-модели или через коллекцию ViewData.

***************************

Создание собственного вспомогательного метода

Поскольку вспомогательные методы — обычные методы расширения класса HtmlHelper, принимающие произвольный набор параметров и возвращающие строковые значения, то создать свой вспомогательный метод не составляет труда. Например, в листинге 5.10 приведена заготовка вспомогательного метода, отображающего элемент управления для ввода даты.

Листинг 5.10. Вспомогательный метод для отображения элемента для ввода даты

using System.Web.Mvc;

public static class DataPickerHelper {

public static string DatePicker(this HtmlHelper html,

string id, string text)

{

}

}

Такой метод может быть использован в коде представления через синтаксис

<%= Html.DatePicker("id", "name") %>.

Непосредственная реализация этого метода может быть разной. Давайте посмотрим на то, как можно подойти к созданию такого простого элемента, как набор выпадающих списков для выбора даты.

Конкатенация строк

Самый очевидный способ — сгенерировать разметку конкатенацией строк. Код для этого метода приведен в листинге 5.11.

Листинг 5.11. Реализация метода DatePickerc помощью конкатенации строк

using System.Web.Mvc;

using System.Text;

using System;

using System.Globalization;

public static class DataPickerHelper

{

public static string DatePicker(this HtmlHelper html, string id)

{

return DatePicker(html, id, String.Empty);

}

public static string DatePicker(this HtmlHelper html,

string id, string text)

{

StringBuilder sb = new StringBuilder;

if (!String.IsNullOrEmpty(text))

{

sb.Append("<div id=\"");

sb.Append (id);

sb.Append("\">");

sb.Append(text);

}

/* Day */

sb.Append("<select id=\"day_");

sb.Append(id);

sb.Append("\">");

Поделиться с друзьями: