if (!ModelState.IsValid)
{
return View(vm);
}
написал вот такой фильтр public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.Controller.ViewData.ModelState.IsValid == false)
{
filterContext.Result = new ViewResult();
}
}
}
но он теряет модель, и тогда весь смысл теряется. public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.Controller.ViewData.ModelState.IsValid == false)
{
if (filterContext.ActionParameters.Count == 1)
{
filterContext.Controller.ViewData.Model = filterContext.ActionParameters.FirstOrDefault().Value;
filterContext.Result = new ViewResult
{
ViewData = filterContext.Controller.ViewData
};
}
else
{
throw new HttpException(400, "validation model error");
}
}
}
}
//фильтр для валидации
public class ValidateModelAttribute: Attribute, IActionFilter
{
public bool AllowMultiple { get; } = false;
public Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext,
CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
//примерно таким способом у меня все работает
if (!actionContext.ModelState.IsValid)
{
// получаем ошибки валидации по пути actionContext.ModelState[0..i].Error[0..j].ErrorMessage
var errors = (
from error in actionContext.ModelState
select new ErrorData("", error.Value.Errors[0].ErrorMessage) {Subject = error.Key}).ToArray();
throw new MyAwesomeValidationException("0x015", "Ошибка валидации") {ErrorData = errors};
}
return null;
}
}
//фильтр для ошибок
public class MyAwesomeExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
var result = new ApiResult<ErrorData[]>() { Result = false };
var sp= actionExecutedContext.Exception as MyAwesomeException;
if (sp!= null)
{
result.Error = sp.Message;
result.ErrorCode = sp.Code;
result.Data = sp.ErrorData;
}
else
{
result.Error = actionExecutedContext.Exception.Message;
result.ErrorCode = "";
}
actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.OK);
actionExecutedContext.Response.Content = new ObjectContent<ApiResult<ErrorData[]>>(result,new JsonMediaTypeFormatter());
}
}