[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 theMvc
andHttp
namespace, respectively.
Source: https://habr.com/ru/post/346308/
All Articles