[HttpPost] public IActionResult Test(SomeParam param) { if (!ModelState.IsValid) { return View(param); // return Json({success: false, state: ModelState}); } dbContext.UpdateData(param); return RedirectToAction("index"); // return Ok({success: true}); } if (!ModelState.IsValid) public enum ValidationResult { View, Json } public class ValidationFilterAttribute: ActionFilterAttribute { private readonly ValidationResult _result; public ValidationFilterAttribute(ValidationResult result = ValidationResult.Json) { _result = result; } public override void OnActionExecuting(ActionExecutingContext context) { if (!context.ModelState.IsValid) { if (_result == ValidationResult.Json) { context.Result = new ValidationFailedResult(context.ModelState); } else { context.Result = ((Controller)context.Controller).View( context.ActionArguments.Values.First()); ValidationFailedResult.SetStatusCodeAndHeaders( context.HttpContext); } } } } internal class ValidationFailedResult: JsonResult { public ValidationFailedResult(ModelStateDictionary modelState) : base(modelState.Select(x => new { x.Key, ValidationState = x.Value.ValidationState.ToString(), x.Value.Errors }).ToList()) { } public override void ExecuteResult(ActionContext context) { base.ExecuteResult(context); SetStatusCodeAndHeaders(context.HttpContext); } internal static void SetStatusCodeAndHeaders(HttpContext context) { context.Response.StatusCode = 422; context.Response.Headers.Add("X-Status-Reason", "Validation failed"); } } ValidationFilterAttribute can be used onView from Json . This can be achieved by creating two base classes or adding an agreement to an attribute, for example, to check for the presence of api in the namespace of the controller.Code examples are given for ASP.NET MVC Core. For ASP.NET MVC, you will have to create two attribute sets for theMvcandHttpnamespace, respectively.
Source: https://habr.com/ru/post/346308/
All Articles