Проверка модели asp.net core 2.0 не проверяет данные

Я использую проверку модели по умолчанию 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 всегда верен. Что мне не хватает?

Вам необходимо установить для идентификатора значение NULL, иначе значение по умолчанию будет равно 0, даже если клиент не отправит идентификатор в запросе.

Marcus Höglund 11.08.2018 13:34

Я точно скопировал ваш код и не могу воспроизвести вашу проблему. Однако следует отметить одно: Required проверяет, что значение не будет null, пустой строкой или пробелом. В вашем случае Id - это не обнуляемый int, поэтому он всегда будет предоставлять значение.

John H 11.08.2018 13:34

Хорошо, у меня есть случай для обязательного, поскольку он должен иметь значение NULL для работы. Но как насчет атрибута Range, почему он не работает?

Ali Shahzad 11.08.2018 13:38

@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 11.08.2018 15:08

@ ironstone13 Но это не работает для меня, и я думаю, что я что-то упускаю

Ali Shahzad 13.08.2018 06:36

Поделитесь с нами проектом, который может воспроизвести вашу проблему.

Edward 13.08.2018 09:48

@AliShahzad Удалось ли вам когда-нибудь разобраться в проблеме?

WBuck 13.11.2020 16:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
7
3 379
3

Ответы 3

Если вы используете services.AddMvcCore(), вам необходимо явно настроить приложение для выполнения проверки с аннотациями данных:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvcCore()
         .AddDataAnnotations()
         /* etc. */;
}

Спасибо @Collin, что исправила аналогичную проблему, с которой мы столкнулись.

Rob 18.03.2019 14:30

Я использовал то же свойство модели, которое вы определили в модели, и столкнулся с той же проблемой. Я внес одно изменение в свойство и определил атрибут 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?
liang 10.11.2020 04:24

Согласно github.com/dotnet/AspNetCore.Docs/issues/… проверка узлов верхнего уровня включена по умолчанию при использовании любой из упомянутых служб.

Geralt 11.11.2020 08:39

Другие вопросы по теме