无论必需字段中的空值如何,ModelState始终被视为有效

Jer*_*vel 9 c# asp.net modelstate asp.net-web-api asp.net-web-api2

我一直在 环顾 四周,我认为我的解决方案很好,但不知何故ModelState.IsValid财产总是如此true.

请考虑以下代码段:

[Route("address")]
[HttpPut]
[ResponseType(typeof(UserViewModel))]
public IHttpActionResult UpdateAddress([FromBody] UpdateAdressValidationModel model)
{
   if (!ModelState.IsValid)
   {
       return BadRequest(ModelState);
   }
   // irrelevant code omitted
}

[TestMethod]
public void UpdateAddress_WithoutStreet_ReturnsHttpCode400()
{
    var userController = new UserController(new UserRepository(_context));
    var addressInfo = new UpdateAdressValidationModel
    {
        City = "Ghent",
    };

    var response = userController.UpdateAddress(addressInfo) as BadRequestResult;

    Assert.IsNotNull(response);
}

public class UpdateAdressValidationModel
{
    [Required]
    public string Street { get; set; }

    [Required]
    public int? Number { get; set; }

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

    [Required]
    public int? PostalCode { get; set; }

    [Required]
    public string City { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

仍然给我一个有效的模型状态,即使它清楚地表明所需的属性null.

在此输入图像描述

我在俯瞰什么?

请注意,手动添加

Validator.ValidateObject(model, new ValidationContext(model));
Run Code Online (Sandbox Code Playgroud)

在顶部UpdateAddress方法引发ValidationExceptionStreet场,因此它可以实际上验证模型.问题仍然存在:为什么不自动?

此外,不适用,因为我model不是null.

Jer*_*vel 7

事实证明,这个答案有正确的想法,但解决方案并不合适.

当发布的数据绑定到视图模型时,将进行验证.然后将视图模型传递到控制器中.您正在跳过第1部分并将视图模型直接传递到控制器中.

这是正确的,但建议的解决方案抛出ValidationException而不是简单地将IsValid属性设置为false.

幸运的是,有一种特定的方法可以做到这一点:ApiController.Validate().通过将这些行添加到我的单元测试中,它将其设置ModelState为无效并且不会抛出异常.

userController.Configuration = new HttpConfiguration();
userController.Validate(addressInfo);
Run Code Online (Sandbox Code Playgroud)