Asp.net mvc framework
Шрифт:
<label for="ProductName">
Название:
</label>
<%= Html.TextBox("ProductName", Model.ProductName) %>
<%= Html.ValidationMessage("ProductName", "*") %>
<label for="UnitPrice">
Цена:
</label>
<%= Html.TextBox("UnitPrice",
String.Format("{0:F}", Model.UnitPrice)) %>
<%= Html.ValidationMessage("UnitPrice", "*") %>
<label for="UnitsInStock">
На складе:
</label>
<%= Html.TextBox("UnitsInStock", Model.UnitsInStock) %>
<%= Html.ValidationMessage("UnitsInStock", "*") %>
<label for="UnitsOnOrder">
</label>
<%= Html.TextBox("UnitsOnOrder", Model.UnitsOnOrder) %>
<%= Html.ValidationMessage("UnitsOnOrder", "*") %>
<input type="submit" value="Save" />
</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 приведена заготовка вспомогательного метода, отображающего элемент управления для ввода даты.
Архимаг. Пробуждение. Трилогия
56. В одном томе
Фантастика:
научная фантастика
рейтинг книги
Алексей Михайлович
4. Романовы. Династия в романах
Проза:
историческая проза
рейтинг книги
Антипсихология
Научно-образовательная:
психология
рейтинг книги