ModelState является допустимым, когда модель запроса фактически недействительна - PullRequest
2 голосов
/ 01 апреля 2019

Я пытаюсь проверить модель запроса в запросе POST для API.Но ModelState.IsValid всегда показывает допустимое независимо от того, верна ли модель, которую я отправил в теле запроса, или нет.Недопустимое тело запроса, как в случае изменения имени поля или типа поля определенного атрибута.

Вот код:

Класс ValidateModelStateAttribute:

public class ValidateModelStateAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            context.Result = new BadRequestObjectResult(context.ModelState);
        }
    }
}

Класс контроллера:

[HttpPost("Search")]
[Produces("application/json")]
public async Task<IActionResult> SearchBook([FromBody]Book searchRequest)
{
    if (searchRequest!= null && !ModelState.IsValid)
    {
        return BadRequest();
    }
    return new ObjectResult("Book!");
}

Книга Модель класса:

[DataContract]
[Serializable]
public class Book
{
    [Required]
    [DataMember]
    public string BookId;
    [Required]
    [DataMember]
    public string BookName;       
}

В классе Startup.cs:

 services.AddMvc(options =>
 {
     options.Filters.Add(typeof(ValidateModelStateAttribute));
 })

При отладке в ValidateModelStateAttributeclass, isValid поле всегда истинно, а key всегда пусто.

Кто-нибудь знает почему?

1 Ответ

4 голосов
/ 02 апреля 2019

Для работы привязки модели в MVC (и JSON.NET, который используется за кадром для тел JSON), ваши члены BookId и BookName должны иметь свойства , но они в настоящее время поля .Вот как это должно выглядеть:

public class Book
{
    [Required]
    public string BookId { get; set; }

    [Required]
    public string BookName { get; set; }
}

(я также удалил DataContract, DataSerializable и DataMember, так как они не нужны).

...