Если я использую атрибуты свойств для проверки, все работает нормально и отображает сообщения об ошибках под формой поле.
Если я использую IValidatableObject, он отображается как JSON.
Пример:
Код: Выделить всё
{"TargetedMemberIds":["Error on ids: \"idwitherror\""]}Я ожидаю, что ValidationResult будет отображаться под полем формы и/или в ValidationSummary
cshtml:
Код: Выделить всё
Specific Targeting
Warning: Turning this on will result in [u]Quotas being ignored completely[/u]
@s.FieldFor(m => m.TargetingByMemberId)
[h4]Member Ids (comma separated)[/h4]
@Html.EditorFor(m => m.TargetedMemberIds, new {@class = "full-width"})
@Html.ValidationMessageFor(m => m.TargetedMemberIds)
Код: Выделить всё
public IEnumerable Validate(ValidationContext validationContext)
{
List validationResult = new List();
if (TargetingByMemberId && string.IsNullOrEmpty(TargetedMemberIds))
{
validationResult.Add(new ValidationResult("Field is required", new[] { nameof(TargetedMemberIds) }));
}
var parts = TargetedMemberIds!.Split(',');
if (parts.Length > 3000)
{
validationResult.Add(new ValidationResult($"Exceeded limit of 3000 ids by {parts.Length - 3000}", new[] { nameof(TargetedMemberIds) }));
}
var unmatched = parts.Where(p => !Guid.TryParse(p, out _)).Select(p => $"\"{p}\"");
if (unmatched.Any())
{
string unmatchedString = string.Join(",", unmatched);
validationResult.Add(new ValidationResult($"Error on ids: {unmatchedString}", new[] { nameof(TargetedMemberIds) }));
}
return validationResult;
}
Код: Выделить всё
[HttpPost]
public async Task Details(Guid surveyId, SurveyViewModel model)
{
if (!ModelState.IsValid)
{
var rewards = await _queryExecutor.QueryAsync(new GetAllRewards());
model.SetRewards(rewards);
model.Id = surveyId;
return View(model);
}
....

Ожидается результат:

Фактический результат:

ОБНОВЛЕНИЕ:
обнаружил, что есть фильтр действий, возвращающий BadRequest:

удалив возврат BadRequest, сообщения об ошибках отображаются так, как ожидалось:
сводка:

под полем:
< img alt="введите здесь описание изображения" src="https://i.sstatic.net/A0rET98J.png" />
Подробнее здесь: https://stackoverflow.com/questions/790 ... lt-as-json