Содержание
В предыдущей части мы затронули такую тему как tag-хэлперы. Тема достаточно интересная и обширная и здесь мы продолжим её рассмотрение с точки зрения использования различных tag-хэлперов для валидации модели в ASP.NET Core MVC.
Для изучения темы нам потребуется приложение из предыдущей части. Там мы использовали следующую модель:
public class Person
{
[Required(ErrorMessage = "Поле Name обязательно к заполнению")]
public string Name { get; set; }
[EmailAddress]
[Remote(action: "CheckMail", controller:"Home", ErrorMessage ="Ошибка: такой email нельзя использовать")]
public string Email { get; set; }
[Range(1, 100, ErrorMessage = "Возраст должен находится в пределах от 1 до 100 лет")]
public int Age { get; set; }
}
и использующее эту модель представление:
@model Person
@{
ViewData["Title"] = "Home Page";
}
<form method="post">
<div>
<p>
<label asp-for="Name">Name</label><br />
<input type="text" asp-for="Name" />
<span asp-validation-for="Name" />
</p>
<p>
<label asp-for="Age">Age</label><br />
<input asp-for="Age" />
<span asp-validation-for="Age" />
</p>
<p>
<label asp-for="Email">Email</label><br />
<input asp-for="Email" />
<span asp-validation-for="Email" />
</p>
<p>
<input type="submit" value="Send" />
</p>
</div>
</form>
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.3/jquery.validate.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.12/jquery.validate.unobtrusive.js"></script>
ValidationMessageTagHelper
Этот tag-хэлпер используется для валидации модели на стороне клиента. Хелпер определяется с помощью атрибута asp-validation-for к элементу <span>. Например,
<span asp-validation-for="Email" />
Атрибут asp-validation-for в качестве значения принимает название свойства модели, для которого будет выводиться сообщение об ошибке валидации. Такие атрибуты мы можем применять ко всем полям, которые необходимо проверить, что, собственно и было сделано в форме выше. В итоге, применение этого tag-хэлпера приведет к тому, что будет сгенерирована следующая html-разметка:
<span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true" />
data-valmsg-for— это значение атрибутаnameэлементаinput, которому принадлежит контейнер.data-valmsg-replace— указывает будет ли сообщение ошибке изменяться в зависимости от того, какое правило будет нарушено. По умолчанию, значение установлено по умолчанию вtrue. Разница между значениямиtrueиfalseследующая: если установлено вtrue, то сообщение об ошибке в контейнере будет изменяться в зависимости от того, какой правило валидации было нарушено, еслиfalse, то будет постоянным и содержание не будет меняться, будет меняться только класс сvalidнаinvalid.
ValidationSummaryTagHelper
Этот tag-хелпер применяется для отображения сводки ошибок валидации. Он должен применяется к элементу <div> в виде атрибута asp-validation-summary. Например, изменим нашу веб-форму следующим образом:
<form method="post">
<div asp-validation-summary="All"></div>
<div>
здесь код полей input формы
</div>
</form>
Теперь запустим приложение и посмотрим, как будут выводится сообщения об ошибках:
Вверху (в месте, где мы определили тэг div с атрибутом asp-validation-summary) выводит сводка, содержащая все сообщения об ошибках в форме. Для asp-validation-summary могут определяться следующие значение:
None— ошибки валидации не отображаютсяModelOnly— отображаются только ошибка валидации уровня модели, ошибки валидации для отдельных свойств не отображаютсяAll— отображаются все ошибки валидации
Сводку об ошибках удобно использовать именно в том случае, когда мы проводим какие-то дополнительные проверки модели на стороне сервера, когда форма проходит формальную валидацию на стороне клиента. Например, изменим метод Index() к контроллере следующим образом:
[HttpPost]
public IActionResult Index(Person person)
{
if (person.Name == "admin")
{
ModelState.AddModelError("", "Имя admin запрещено использовать");
}
if (ModelState.IsValid)
return Ok(person);
return View();
}
если пользователь введет имя admin, то при выполнении метода Index() будет изменено состояние модели:
ModelState.AddModelError("", "Имя admin запрещено использвоать")
Пустая строка в первом параметре указывает, что ошибка относится к уровню модели. Теперь мы можем использовать в атрибуте asp-validation-summary значение ModelOnly
form method="post">
<div asp-validation-summary="ModelOnly"></div>
....
</form>
и посмотреть на результат:
Стилизация вывода сообщений об ошибках
Когда происходит валидация, то при отображении ошибок соответствующим полям присваиваются определенные классы css:
<form method="post">
<div class="validation-summary-errors">
<ul>
<li>
</li>
</ul>
</div>
<div>
<p>
<span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true" />
</p>
<p>
<span class="field-validation-valid" data-valmsg-for="Age" data-valmsg-replace="true" />
</p>
<p>
<span class="field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true" />
</p>
<p>
<input type="submit" value="Send" />
</p>
</div>
- для блока ошибок, который генерируется хелпером
ValidationSummaryTagHelper, при наличии ошибок устанавливается классvalidation-summary-errors. Если ошибок нет, то данный блок не отображается - для элемента
<span>, который отображает ошибку для каждого отдельного поля и который генерируется хелперомValidationTagHelper, при наличии ошибок устанавливается классfield-validation-error. Если ошибок нет, то данный элемент имеет классfield-validation-valid - для поля ввода при наличии ошибок устанавливается класс
input-validation-error. Если ошибок нет, то устанавливается классvalid
Используя эти классы, мы можем настроить отображение сообщений об ошибках. Добавим в файл wwwroot/css/site.css следующие строки
.field-validation-error {
color: #ff0000;
}
input.input-validation-error {
border: 1px solid #ff0000;
}
input.valid {
border: 1px solid #16a085;
}
.validation-summary-errors {
color: #b94a48;
}
Посмотрим на результат:
Итого
Tag-хэлперы валидации позволяют выводить сообщения об ошибках непосредственно в представлении. Ошибки можно выводить как отдельно для каждого поля, так и в виде сводки. При необходимости, мы можем использовать CSS для стилизации вывода сообщений об ошибках.


