В ядре 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
.
Когда я нажимаю на кнопку «Отправить» без ввода имени задачи, проверка на стороне клиента работает, как и ожидалось, и отображает сообщение об ошибке в пользовательском интерфейсе.
Когда проверка сервера завершается неудачно, и, поскольку у меня включена глобальная проверка, сервер возвращает 400 с сериализованным состоянием модели, как и ожидалось.
Однако пользовательский интерфейс отображает строковое сообщение {"TaskName":["Server validation failed."]}
Я понимаю, почему это происходит, но, конечно, это не ожидаемое поведение.
Есть ли лучший способ обрабатывать проверку глобально в стандартном сценарии отправки формы?
или мы должны придерживаться Ajax POST, только если я выполняю глобальную проверку.