Глобальная валидация со стандартной формой отправки в ядре asp.net - PullRequest
0 голосов
/ 08 июня 2019

В ядре asp.net я выполняю глобальную проверку, добавляя глобальные ActionFilterAttribute

public class ValidateRequestAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (context.ModelState.IsValid == false)
        {
            context.Result = new BadRequestObjectResult(context.ModelState);                
        }
    }
}

и затем зарегистрируйте его при запуске

services.AddMvc(options =>
{
    options.Filters.Add(typeof(ValidateRequestAttribute));
})

У меня есть простая модель с проверкой на стороне сервера и соответствующей формой

public class TaskModel: IValidatableObject
{
    public int? TaskID { get; set; }

    [Required(ErrorMessage = "Task Name is required.")]
    public string TaskName { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        // Do server side validation
        if (TaskName != "MyTask")
        {
            yield return new ValidationResult("Server validation failed.", new string[] { nameof(TaskName) });
        }
        else
        {
            yield return ValidationResult.Success;
        }
    }
}

Форма

<button form="createForm" type="submit" id="btnSave">Save</button>

<form id="createForm" asp-action="Create" asp-controller="Tasks">    
    <div class="form-group">
        <label for="TaskName">Task Name</label>
        <input type="text" class="form-control w-25" asp-for="TaskName" />
        <span asp-validation-for="TaskName" class="text-danger"></span>
    </div>
</form>

У меня также есть jquery.validate и jquery.validate.unobtrusive.

Когда я нажимаю на кнопку «Отправить» без ввода имени задачи, проверка на стороне клиента работает, как и ожидалось, и отображает сообщение об ошибке в пользовательском интерфейсе.
enter image description here

Когда проверка сервера завершается неудачно, и, поскольку у меня включена глобальная проверка, сервер возвращает 400 с сериализованным состоянием модели, как и ожидалось. Однако пользовательский интерфейс отображает строковое сообщение {"TaskName":["Server validation failed."]}

enter image description here

Я понимаю, почему это происходит, но, конечно, это не ожидаемое поведение.

Есть ли лучший способ обрабатывать проверку глобально в стандартном сценарии отправки формы?

или мы должны придерживаться Ajax POST, только если я выполняю глобальную проверку.

1 Ответ

0 голосов
/ 10 июня 2019

Я нашел решение в одном из постов SO,

public class ValidateRequestAttribute : ActionFilterAttribute
{
    public ValidateRequestAttribute()
    {
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            Controller controller = context.Controller as Controller;
            object model = context.ActionArguments.Any()
               ? context.ActionArguments.First().Value
               : null;

            context.Result = (IActionResult)controller?.View(model)
               ?? new BadRequestObjectResult(context.ModelState);
        }

        base.OnActionExecuting(context);          
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...