Как одновременно отображать сообщения об ошибках из проверки на сервере и проверки на стороне клиента? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть это свободное правило проверки:

public EmployeeAbsenceValidator() {
    RuleFor(a => a.DateTo)
        .GreaterThanOrEqualTo(a => a.DateFrom)
        .WithMessage("The end date cannot be before the start date.");
}

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

if (ModelState.IsValid)
{
    EmployeeAbsenceValidator validator = new EmployeeAbsenceValidator();
    ValidationResult result = validator.Validate(employeeAbsence);
    if (result.IsValid)
    {
        _context.Add(employeeAbsence);
        await _context.SaveChangesAsync();
        return RedirectToAction("Details", "Employees");
    }
    else
    {
        result.AddToModelState(ModelState, null); // Passing error message to model state
        return View(employeeAbsence);
    }
}

Это представление создания отсутствия:

<form asp-action="Create">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="row">
        <div class="form-group col-md-4">
            <label asp-for="Percentage" class="control-label"></label>
            <input asp-for="Percentage" class="form-control" />
            <span asp-validation-for="Percentage" class="text-danger"></span>
        </div>
    </div>
    <div class="row">
        <div class="form-group col-md-6">
            <label asp-for="DateFrom" class="control-label"></label>
            <input asp-for="DateFrom" class="form-control" />
            <span asp-validation-for="DateFrom" class="text-danger"></span>
        </div>
        <div class="form-group col-md-6">
            <label asp-for="DateTo" class="control-label"></label>
            <input asp-for="DateTo" class="form-control" />
            <span asp-validation-for="DateTo" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <button type="submit" value="Save">Save</button>
    </div>
</form>

Если Percentageзаполнено правильно, и DateTo предшествует DateFrom, сообщение об ошибке из-за полной проверки отображается на дату.Но если Percentage недопустим, отображается только сообщение об ошибке на стороне клиента на Percentage.Я предполагаю, что это потому, что сервер не знает о недействительности дат, поскольку форма еще не была отправлена.Как я могу получить оба сообщения об ошибках?(Пожалуйста, скажите мне, что мне не нужно писать JQuery ...)

1 Ответ

0 голосов
/ 13 мая 2019

FluentValidation - это серверная структура.Не все правила, определенные в FluentValidation, будут работать с проверкой на стороне клиента ASP.NET.Но вы можете добавить поддержку проверки на стороне клиента в библиотеку Fluent Validation с помощью Form Helper.

https://github.com/sinanbozkus/FormHelper

Добавить FormHelper из диспетчера пакетов Nuget в свой проект.

Зарегистрировать FormHelperв вашем файле startup.cs

services.AddFormHelper();

Создайте формы следующим образом:

var formConfig = new FormConfig(ViewContext)
{
    FormId = "ProductForm",
    FormTitle = "New Product",
    Callback = "ProductFormCallback" // optional,
};

// <form id="@formConfig.FormId" asp-controller="Home" asp-action="Save"
// ...

@await Html.RenderFormScript(formConfig)

И используйте этот атрибут в действии сохранения для проверки на стороне клиента:

[HttpPost, FormValidator]
public IActionResult Save(FormViewModel viewModel)

Он готов к использованию.

Вы можете посмотреть страницу github для получения дополнительной информации.

...