Asp.Net核心WebApi模型状态不起作用

时间:2017-04-29 09:45:36

标签: c# asp.net json asp.net-web-api modelstate

我有这个webapi并试图使用“modelstate.IsValid”函数,但我遇到了一些奇怪的问题。 我的控制器中有以下方法:

[HttpPut]
    [Route("{id}")]
    public async Task<IActionResult> Put([FromBody]ItemUpdateModel model, [FromRoute]int id)
    {
        if (!ModelState.IsValid) //Here i have a breakpoint!
        {
            return BadRequest(new
            {
                code = 400,
                message = ModelState.Values.First().Errors.First().ErrorMessage
            });
        }
}

这是模型,ItemUpdateModel

using System.ComponentModel.DataAnnotations;

namespace TestApi.Models
{
    public class ItemUpdateModel
    {
        [Required]
        [Display(Name = "title")]
        [MaxLength(40)]
        public string Title { get; set; }

        [Required]
        [Display(Name = "discount")]
        public double Discount { get; set; }

        [Required]
        [Display(Name = "priceupdate")]
        public bool PriceUpdate { get; set; }
    }
}

我使用Postman在身体中使用动词PUT和格式json发送此http请求:

  

{       “标题”:“一些测试”,       “折扣”:0,       “priceupdate”:false   }

此请求应该通过,但即使我试图省略一些属性,模型状态也始终为真。 所以在查看模型状态时,这个模型完全绑定到它。只有[FromRoute] int id是bind,而modelstate才有效。

除了模型状态验证/绑定之外,模型无论如何都要填充数据和工作。

同样在标题中包括:“application / json; charset = utf-8”

任何人都可以帮助我解决这个问题,我为此付出了很多努力,这似乎是一项非常简单的任务:)

谢谢!

2 个答案:

答案 0 :(得分:1)

终于解决了这个问题。

由于某种原因,如果模型的“有效”,则模型状态处理模型。并且模型通过JSON格式化程序变得有效,通过为布尔值添加值0或false来为数据类型double和int添加缺失值。解决方案是使属性在模型中可以为空,如

  公共双重?价格{得到;组; }

现在,当我发布请求时,价格为NULL并在模型状态中显示为无效。

答案 1 :(得分:0)

如果您希望属性是必需的/存在于有效负载上,则还需要使用[BindRequired]