Я переносу приложение MVC .NET Framework 4.7.2 в приложение .NET Core 2.1.
Моя ViewModel выглядит так:
public class MyViewModel, IValidatableObject
{
[Required(ErrorMessage = "Please enter a name")]
public string Name { get; set; }
//Other props removed for brevity
}
У меня есть вызов ajax для сохранения данных на экране, который обращается к API с атрибутом JsonValidationFilter, как показано ниже:
[HttpPost]
[JsonValidationFilter]
[Route("api/MyController/Id}/Save")]
public async Task<IActionResult> SaveAsync(int Id, MyViewModel model)
{
//code removed for brevity
_myService.Save();
return Ok();
}
Таким образом, код в моем ValidationFilter для версии приложения .NET Framework выглядит следующим образом:
public class JsonValidationFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid) return;
var errorMessages = actionContext.ModelState.Values
.SelectMany(modelState => modelState.Errors.Select(x => x.ErrorMessage));
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, Json.Encode(errorMessages));
}
}
И если я пытаюсь сохранить экран с именем, я попадаю в функцию ошибки моего Ajax-вызова, и появляется сообщение о проверке, и ошибка проверки содержится в xhr.responseText , поэтому он отображается как ожидается.
error: function (xhr) {
$(saveAlertTarget).html('<span class="glyphicon glyphicon-warning-sign"></span>There was a problem with the last save attempt');
if (xhr.status == '400') {
displayErrorMessage("Please fix validation errors before saving", xhr.responseText);
}
}
Я попытался переписать фильтр проверки в .NET Core, как показано ниже, - и я попадаю в часть ошибки моего Ajax-вызова с запросом 400, поэтому отображается предупреждение о проверке, но оно никогда не формирует сообщение полностью, потому что xhr.responseText всегда пусто - я что-то пропустил, настраивая это?
Мой .NET Core JsonValidationFilter
public class JsonValidationFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext actionContext)
{
if (actionContext.ModelState.IsValid) return;
IEnumerable<string> errorMessages = actionContext.ModelState.Values.SelectMany(modelState => modelState.Errors.Select(x => x.ErrorMessage));
actionContext.Result = new BadRequestObjectResult(errorMessages);
}
}