Я использую проверку модели по умолчанию ASP.NET Core 2.0, и, похоже, не всегда работает с ModelState.IsValid, несмотря на неправильные данные в модели.
[HttpPost("abc")]
public async Task<IActionResult> Abc([FromBody]AbcViewModel model)
{
if (!ModelState.IsValid) { return BadRequest(ModelState); }
...
}
public class AbcViewModel
{
[Required(ErrorMessage = "Id is required")]
[Range(100, int.MaxValue, ErrorMessage = "Invalid Id")]
public int Id { get; set; }
public bool Status { get; set; }
}
Когда я отправляю данные из приложения Angular, значения правильно сопоставляются с моделью, но если Id равен «0» или меньше 100, валидаторы Required и Range не работают, а ModelState.IsValid всегда верен. Что мне не хватает?
Я точно скопировал ваш код и не могу воспроизвести вашу проблему. Однако следует отметить одно: Required проверяет, что значение не будет null, пустой строкой или пробелом. В вашем случае Id - это не обнуляемый int, поэтому он всегда будет предоставлять значение.
Хорошо, у меня есть случай для обязательного, поскольку он должен иметь значение NULL для работы. Но как насчет атрибута Range, почему он не работает?
@AliShahzad, то же самое для меня, Range работает так, как ожидалось - когда Id находится за пределами диапазона или не предоставлен (по умолчанию ноль), я получаю 400 BadRequest POST / api / values / abc HTTP / 1.1 Host: localhost: 61154 Content-Type: application / json Cache-Control: no-cache Postman-Token: 62024574-776a-4e1b-93b7-6a7bb78ecfca {"Id": 1} 400 Bad Request {"Id": ["Invalid Id"]}
@ ironstone13 Но это не работает для меня, и я думаю, что я что-то упускаю
Поделитесь с нами проектом, который может воспроизвести вашу проблему.
@AliShahzad Удалось ли вам когда-нибудь разобраться в проблеме?





Если вы используете services.AddMvcCore(), вам необходимо явно настроить приложение для выполнения проверки с аннотациями данных:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvcCore()
.AddDataAnnotations()
/* etc. */;
}
Спасибо @Collin, что исправила аналогичную проблему, с которой мы столкнулись.
Я использовал то же свойство модели, которое вы определили в модели, и столкнулся с той же проблемой. Я внес одно изменение в свойство и определил атрибут DataMember для свойства, например:
[Required(ErrorMessage = "Id is required")]
[Range(100, int.MaxValue, ErrorMessage = "Invalid Id")]
[DataMember(Name = "Id")]
public int Id { get; set; }
Он работает, как ожидалось, проверяя значения диапазона. Попробуйте это, надеюсь, это решит проблему, с которой вы столкнулись.
Я также боролся с этой проблемой, и в моем случае помогло добавление этого в ConfigureServices:
services.AddMvc(opt=> {
opt.AllowValidatingTopLevelNodes = true;
});
Просто будьте осторожны с результатом - если вы хотите получить автоматический BadRequest, вы должны использовать [ApiController]атрибут. В противном случае вам необходимо проверить свойство ModelState.IsValid.
AllowValidatingTopLevelNodes устарел из 2.2 и не встречается в 3.1. Есть идеи, как использовать его в 3.1?
Согласно github.com/dotnet/AspNetCore.Docs/issues/… проверка узлов верхнего уровня включена по умолчанию при использовании любой из упомянутых служб.
Вам необходимо установить для идентификатора значение NULL, иначе значение по умолчанию будет равно 0, даже если клиент не отправит идентификатор в запросе.