【问题标题】:ModelState is always considered valid, regardless of null values in required fields无论必填字段中的空值如何,ModelState 始终被认为是有效的
【发布时间】:2014-11-05 16:25:52
【问题描述】:

I've beenlookingaround,我认为我的解决方案很好,但不知何故,ModelState.IsValid 属性始终是true

考虑以下代码 sn-ps:

[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; }
}

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

我忽略了什么?

注意manually adding

Validator.ValidateObject(model, new ValidationContext(model));

UpdateAddress 方法的顶部,在Street 字段上抛出ValidationException,因此它实际上可以验证模型。问题仍然存在:为什么它不自动?

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

【问题讨论】:

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


【解决方案1】:

原来this answer 有正确的想法,但解决方案不太合适。

验证发生在发布的数据绑定到视图模型时。然后将视图模型传递给控制器​​。您正在跳过第 1 部分并将视图模型直接传递给控制器​​。

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

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

userController.Configuration = new HttpConfiguration();
userController.Validate(addressInfo);

【讨论】:

    【解决方案2】:

    执行路径中的任何内容都不会导致验证发生。这是作为模型绑定的一部分完成的,而您在手动创建模型实例时并没有这样做。

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多