2014-11-05 28 views
9

I've beenlookingaround我認爲我的解決方案很好,但不知何故ModelState.IsValid屬性總是trueModelState始終被認爲是有效的,不管所需字段中的值是否爲空

考慮下面的代碼片段:

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

仍然給我一個有效的ModelState,即使它清楚地表明,需要的屬性是null

enter image description here

我是什麼俯瞰?

注意manually adding

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

UpdateAddress方法的頂部上Street字段拋出一個ValidationException所以它實際上可以驗證模型。問題依然存在:爲什麼不自動?

此外,this不適用,因爲我的model不是null

+0

的可能重複[測試的ModelState總是在asp.net mvc的有效(http://stackoverflow.com/questions/8165026/testing-modelstate-is-always-valid-in-asp-net- MVC) – 2014-11-05 17:22:10

回答

7

原來,this answer有正確的想法,但解決方案不太合適。

當發佈的數據綁定到視圖模型時發生驗證。視圖模型然後被傳遞給控制器​​。您正在跳過第1部分,並將視圖模型直接傳遞給控制器​​。

哪個是正確的,但提出的解決方案拋出一個ValidationException而不是簡單的IsValid屬性設置爲false

幸運的是,有一個具體的方法可以做到這一點:ApiController.Validate()。通過將這些行添加到我的單元測試中,它將ModelState設置爲無效,不會引發異常

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

執行路徑中的任何內容都不會導致驗證發生。這是作爲模型綁定的一部分完成的,當您手動創建模型實例時,您沒有這樣做。

相關問題