ASP.NET MVC 4
Адам Фриман
Создание проекта для примера
Прежде чем начать, мы создадим простое приложение MVC, к которому будем применять различные техники валидации моделей. Мы создали новый проект MVC под названием ModelValidation
на шаблоне Basic
, а также новый класс модели под названием Appointment.cs
, который показан в листинге 23-1.
Листинг 23-1: Класс модели Appointment
using System;
using System.ComponentModel.DataAnnotations;
namespace ModelValidation.Models
{
public class Appointment
{
public string ClientName { get; set; }
[DataType(DataType.Date)]
public DateTime Date { get; set; }
public bool TermsAccepted { get; set; }
}
}
В классе модели Appointment
мы определили три свойства и указали с помощью атрибута DataType
, что свойство Date
должно быть выражено в формате даты без компонента времени.
Для этого примера мы также создали контроллер Home
и определили методы действий, которые работают с классом модели Appointment
, как показано в листинге 23-2.
Листинг 23-2: КонтроллерHome
в проектеModelValidation
using System;
using System.Web.Mvc;
using ModelValidation.Models;
namespace ModelValidation.Controllers
{
public class HomeController : Controller
{
public ViewResult MakeBooking()
{
return View(new Appointment {Date = DateTime.Now});
}
[HttpPost]
public ViewResult MakeBooking(Appointment appt)
{
// statements to store new Appointment in a
// repository would go here in a real project
return View("Completed", appt);
}
}
}
Как и в предыдущих главах, мы определили две версии метода действия MakeBooking
. В этой главе нас интересует версия с атрибутом HttpPost
, так как именно в ней будет применяться связывание данных для создания объекта параметра Appointment
.
Обратите внимание, что в реальном приложении мы указали бы в комментариях, где находятся операторы для сохранения информации об объекте Appointment
, который будет создан механизмом связывания. В этом примере мы не собираемся создавать хранилище, потому что хотим сосредоточиться на процессах связывания данных и валидации. Однако, важно помнить, что цель валидации модели - предотвратить сохранение в хранилище нежелательных или бессмысленных данных и возникновение проблем (при попытке их сохранения или, в дальнейшем, обработки).
Чтобы завершить наш пример приложения, создадим пару представлений для работы с методами действий в папке /Views/Home
. В листинге 23-3 показано содержимое файла MakeBooking.cshtml
, который содержит форму для создания новой записи на прием.
Листинг 23-3: Содержимое файла MakeBooking.cshtml
@model ModelValidation.Models.Appointment
@{
ViewBag.Title = "Make A Booking";
}
<h4>Book an Appointment</h4>
@using (Html.BeginForm())
{
<p>Your name: @Html.EditorFor(m => m.ClientName)</p>
<p>Appointment Date: @Html.EditorFor(m => m.Date)</p>
<p>@Html.EditorFor(m => m.TermsAccepted) I accept the terms & conditions</p>
<input type="submit" value="Make Booking" />
}
Когда форма будет отправлена обратно к приложению, метод действия MakeBooking
отобразит подробную информацию о созданной пользователем записи с помощью представления Completed.cshtml
, которое показано в листинге 23-4.
Листинг 23-4: Содержимое файла Completed.cshtml
@model ModelValidation.Models.Appointment
@{
ViewBag.Title = "Completed";
}
<h4>Your appointment is confirmed</h4>
<p>Your name is: <b>@Html.DisplayFor(m => m.ClientName)</b></p>
<p>The date of your appointment is: <b>@Html.DisplayFor(m => m.Date)</b></p>
Как вы уже поняли, наш пример для этой главы основан на создании записей на прием. Чтобы увидеть, как это работает, запустите приложение и перейдите по ссылке Home/MakeBooking
. Введите реквизиты в форму и нажмите кнопку Submit
, чтобы отправить данные на сервер; он выполнит связывание данных и создаст объект Appointment
, информация о котором затем будет отображена в представлении Completed.cshtml
, как показано на рисунке 23 -1.
Рисунок 23-1: Используем пример приложения
Сейчас наше приложение будет принимать любые данные, которые отправит пользователь, но, чтобы сохранить целостность нашего приложения и доменной модели, мы будем требовать выполнения трех условий, прежде чем принять отправленный пользователем объект Appointment
:
- Пользователь должен указать имя.
- Пользователь должен указать дату (в формате
mm/dd/yyyy
), которая относится к будущему. - Пользователь должен отметить чекбокс, чтобы принять условия пользовательского соглашения.
Валидация модели – это процесс проверки соблюдения этих требований. В следующих разделах мы покажем вам различные техники для проверки указанных пользователем данных и предоставления обратной связи в тех случаях, когда мы не можем использовать полученные данные.