Поделиться через


Выполнение простой проверки (C#)

Стивен Уолтер (Stephen Walther)

Узнайте, как выполнять проверку в ASP.NET приложении MVC. В этом руководстве Стивен Уолтер знакомит вас с состоянием модели и вспомогательными средствами ПРОВЕРКИ HTML.

Цель этого руководства — объяснить, как можно выполнить проверку в ASP.NET приложении MVC. Например, вы узнаете, как запретить отправку формы, которая не содержит значения для обязательного поля. Вы узнаете, как использовать состояние модели и вспомогательные средства HTML проверки.

Основные сведения о состоянии модели

Для представления ошибок проверки используется состояние модели или, точнее, словарь состояний модели. Например, действие Create() в листинге 1 проверяет свойства класса Product перед добавлением класса Product в базу данных.

Не рекомендуется добавлять проверку или логику базы данных в контроллер. Контроллер должен содержать только логику, связанную с управлением потоком приложения. Мы берем ярлык, чтобы все было проще.

Листинг 1. Controllers\ProductController.cs

//
// POST: /Product/Create

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="Id")] Product productToCreate)
{
    // Validation logic
    if (productToCreate.Name.Trim().Length == 0)
        ModelState.AddModelError("Name", "Name is required.");
    if (productToCreate.Description.Trim().Length == 0)
        ModelState.AddModelError("Description", "Description is required.");
    if (productToCreate.UnitsInStock

В листинге 1 проверяются свойства Name, Description и UnitsInStock класса Product. Если какое-либо из этих свойств не проходит проверочный тест, в словарь состояния модели (представленный свойством ModelState класса Controller) добавляется ошибка.

При наличии ошибок в состоянии модели свойство ModelState.IsValid возвращает значение false. В этом случае html-форма для создания нового продукта переигрывается. В противном случае при отсутствии ошибок проверки новый продукт добавляется в базу данных.

Использование вспомогательных средств проверки

Платформа ASP.NET MVC включает в себя два вспомогательных средства проверки: вспомогательное средство Html.ValidationMessage() и вспомогательное средство Html.ValidationSummary(). Эти два вспомогательных компонента используются в представлении для отображения сообщений об ошибках проверки.

Вспомогательные функции Html.ValidationMessage() и Html.ValidationSummary() используются в представлениях Create и Edit, которые автоматически создаются шаблоном ASP.NET MVC. Чтобы создать представление "Создать", выполните следующие действия.

  1. Щелкните правой кнопкой мыши действие Create() в контроллере продукта и выберите пункт меню Добавить представление (см. рис. 1).
  2. В диалоговом окне Добавление представления проверка флажок Создать строго типизированное представление (см. рис. 2).
  3. В раскрывающемся списке Просмотреть класс данных выберите класс Product.
  4. В раскрывающемся списке Просмотреть содержимое выберите Создать.
  5. Нажмите кнопку Добавить.

Перед добавлением представления обязательно выполните сборку приложения. В противном случае список классов не будет отображаться в раскрывающемся списке Просмотреть класс данных .

Снимок экрана: файл product Controller dot c s в редакторе кода, в котором показано контекстное меню с выделенным пунктом меню Добавить представление.

Рис. 01. Добавление представления (щелкните, чтобы просмотреть полноразмерное изображение)

Снимок экрана: диалоговое окно

Рис. 02. Создание строго типизированного представления (щелкните, чтобы просмотреть полноразмерное изображение)

После выполнения этих действий вы получите представление Создание в листинге 2.

Листинг 2. Views\Product\Create.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.Product>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<title>Create</title>
</asp:Content>

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

    <h2>Create</h2>

    <%= Html.ValidationSummary() %>

    <% using (Html.BeginForm()) {%>

        <fieldset>
            <legend>Fields</legend>
            <p>
                <label for="Name">Name:</label>
                <%= Html.TextBox("Name") %>
                <%= Html.ValidationMessage("Name", "*") %>
            </p>
            <p>
                <label for="Description">Description:</label>
                <%= Html.TextBox("Description") %>
                <%= Html.ValidationMessage("Description", "*") %>
            </p>
            <p>
                <label for="Price">Price:</label>
                <%= Html.TextBox("Price") %>
                <%= Html.ValidationMessage("Price", "*") %>
            </p>
            <p>
                <label for="UnitsInStock">UnitsInStock:</label>
                <%= Html.TextBox("UnitsInStock") %>
                <%= Html.ValidationMessage("UnitsInStock", "*") %>
            </p>
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>

    <% } %>

    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>

</asp:Content>

В листинге 2 вспомогательное средство Html.ValidationSummary() вызывается непосредственно над HTML-формой. Эта вспомогатель используется для отображения списка сообщений об ошибках проверки. Вспомогательное средство Html.ValidationSummary() отображает ошибки в маркированный список.

Вспомогатель Html.ValidationMessage() вызывается рядом с каждым из полей формы HTML. Эта вспомогатель используется для отображения сообщения об ошибке рядом с полем формы. В примере с листингом 2 вспомогающая функция Html.ValidationMessage() отображает звездочку при возникновении ошибки.

На странице на рисунке 3 показаны сообщения об ошибках, отображаемые вспомогательными средствами проверки при отправке формы с отсутствующими полями и недопустимыми значениями.

Снимок экрана: окно интернет-Обозреватель, в котором отображается представление

Рис. 03. Представление "Создать", отправленное с проблемами (щелкните, чтобы просмотреть полноразмерное изображение)

Обратите внимание, что внешний вид полей ввода HTML также изменяется при возникновении ошибки проверки. Вспомогатель Html.TextBox() отображает атрибут class="input-validation-error" при возникновении ошибки проверки, связанной со свойством, отображаемым вспомогательным объектом Html.TextBox().

Существует три класса каскадных таблиц стилей, которые используются для управления внешним видом ошибок проверки:

  • input-validation-error — применяется к тегу <ввода> , отображаемого вспомогательным модулером Html.TextBox().
  • field-validation-error — применяется к тегу <span> , отображаемого вспомогательным методом Html.ValidationMessage().
  • validation-summary-errors — применяется к тегу <ul> , отображаемого вспомогательной функцией Html.ValidationSummary().

Вы можете изменить эти классы каскадных таблиц стилей и, следовательно, изменить внешний вид ошибок проверки, изменив файл Site.css, расположенный в папке Содержимое.

Примечание

Класс HtmlHelper включает статические свойства только для чтения для получения имен классов CSS, связанных с проверкой. Эти статические свойства называются ValidationInputCssClassName, ValidationFieldCssClassName и ValidationSummaryCssClassName.

Предварительная проверка и проверка после привязки

Если отправить HTML-форму для создания продукта и ввести недопустимое значение для поля цена и значение для поля UnitsInStock, вы получите сообщения проверки, отображаемые на рисунке 4. Откуда берутся эти сообщения об ошибках проверки?

Снимок экрана: окно интернет-Обозреватель, в котором отображаются поля

Рис. 04. Ошибки предварительной привязки проверки (щелкните для просмотра полноразмерного изображения)

На самом деле существует два типа сообщений об ошибках проверки: сообщения, созданные до того, как поля HTML-формы привязаны к классу, и сообщения, созданные после привязки полей формы к классу. Иными словами, существуют ошибки предварительной привязки и ошибки проверки после привязки.

Действие Create(), предоставляемое контроллером Product в листинге 1, принимает экземпляр класса Product. Сигнатура метода Create выглядит следующим образом:

public ActionResult Create([Bind(Exclude="Id")] Product productToCreate)

Значения полей HTML-формы из формы Создания привязаны к классу productToCreate с помощью связывателя модели. Связыватель модели по умолчанию автоматически добавляет сообщение об ошибке в состояние модели, если не удается привязать поле формы к свойству формы.

Связыватель модели по умолчанию не может привязать строку apple к свойству Price класса Product. Вы не можете назначить строку десятичному свойству. Поэтому связыватель модели добавляет ошибку в состояние модели.

Связыватель модели по умолчанию также не может присвоить значение NULL свойству, которое не принимает значения NULL. В частности, связыватель модели не может присвоить свойству UnitsInStock значение NULL. Опять же, связыватель модели отступает и добавляет сообщение об ошибке в состояние модели.

Если вы хотите настроить внешний вид этих предварительных сообщений об ошибках, необходимо создать строки ресурсов для этих сообщений.

Итоги

Цель этого руководства состояла в том, чтобы описать основные механизмы проверки в ASP.NET платформы MVC. Вы узнали, как использовать состояние модели и вспомогательные средства HTML проверки. Мы также обсудили различие между предварительной привязкой и проверкой после привязки. В других руководствах мы обсудим различные стратегии перемещения кода проверки из контроллеров и в классы моделей.