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

    <%=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();

}

Asp.net mvc framework - img_37

Asp.net mvc framework - img_38

Листинг 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>

      <p>

        <label for="ProductID">

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

        </label>

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

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

      </p>

      <p>

        <label for="ProductName">

          Название:

        </label>

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

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

      </p>

      <p>

        <label for="UnitPrice">

          Цена:

        </label>

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

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

      </p>

      <p>

        <label for="UnitsInStock">

          На складе:

        </label>

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

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

      </p>

      <p>

        <label for="UnitsOnOrder">

          Заказано:

        </label>

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

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

      </p>

      <p>

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

      </p>

    </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("\">");

    sb.Append("<option></option>") ;

    for (int i = 1; i <= 31; i++)

    {

      sb.Append("<option>");

      sb.Append(i.ToString());

      sb.Append("</option>");

      sb.Append("</select>");

      sb.Append(" ");

    }

    /* Month */

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