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

2024-01-12

我去过 https://stackoverflow.com/questions/24240834/model-validation-why-modelstate-isvalid-always-returns-true-even-when-no-value looking http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api around https://stackoverflow.com/questions/11686690/handle-modelstate-validation-in-asp-net-web-api我认为我的解决方案很好,但不知何故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; }
}

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

我在忽略什么?

注意手动添加 https://stackoverflow.com/questions/8165026/testing-modelstate-is-always-valid-in-asp-net-mvc?rq=1

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

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

此外,this https://stackoverflow.com/questions/17923622/modelstate-isvalid-even-when-it-should-not-be不适用,因为我的model isn't null.


事实证明这个答案 https://stackoverflow.com/questions/8165026/testing-modelstate-is-always-valid-in-asp-net-mvc/8165243#8165243有正确的想法,但解决方案不太合适。

当发布的数据绑定到视图模型时,就会发生验证。然后视图模型被传递到控制器中。您将跳过第 1 部分并将视图模型直接传递到控制器中。

这是正确的,但建议的解决方案会抛出 ValidationException 而不是简单地设置IsValid财产给false.

幸运的是,有一种特定的方法可以做到这一点:ApiController.Validate() http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.validate(v=vs.118).aspx。通过将这些行添加到我的单元测试中,它设置了ModelState至无效和不抛出异常.

userController.Configuration = new HttpConfiguration();
userController.Validate(addressInfo);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无论必填字段中的空值如何,ModelState 始终被视为有效 的相关文章

随机推荐