我有这个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”
任何人都可以帮助我解决这个问题,我为此付出了很多努力,这似乎是一项非常简单的任务:)
谢谢!
答案 0 :(得分:1)
终于解决了这个问题。
由于某种原因,如果模型的“有效”,则模型状态处理模型。并且模型通过JSON格式化程序变得有效,通过为布尔值添加值0或false来为数据类型double和int添加缺失值。解决方案是使属性在模型中可以为空,如
公共双重?价格{得到;组; }
现在,当我发布请求时,价格为NULL并在模型状态中显示为无效。
答案 1 :(得分:0)
如果您希望属性是必需的/存在于有效负载上,则还需要使用[BindRequired]
。