2014-11-05 12 views
9

I've beenlookingaround e penso che la mia soluzione va bene, ma in qualche modo la proprietà ModelState.IsValid è sempre true.ModelState è sempre considerata valida, a prescindere di valori nulli nei campi richiesti

Si consideri il seguente frammenti di codice:

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

mi dà ancora un ModelState valida, anche se mostra chiaramente che le proprietà richieste sono null.

enter image description here

cosa sto trascurando?

Nota che manually adding

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

nella parte superiore del metodo UpdateAddress getta un ValidationException sul campo Street in modo che possa di fatto validare il modello. La domanda rimane: perché non lo fa automaticamente?

Inoltre, this non è applicabile perché il mio model non è null.

+0

possibile duplicato del [test ModelState è sempre valida in asp.net mvc] (http://stackoverflow.com/questions/8165026/testing-modelstate-is-always-valid-in-asp-net- MVC) –

risposta

7

Si è scoperto che l'this answer aveva l'idea giusta ma la soluzione non si adattava perfettamente.

La convalida avviene quando i dati registrati sono associati al modello di visualizzazione. Il modello di visualizzazione viene quindi passato nel controller. Stai saltando la parte 1 e passando un modello di vista direttamente in un controller.

che è corretto, ma la soluzione proposta getta una ValidationException invece di impostare semplicemente la proprietà IsValid-false.

Fortunatamente, esiste un metodo specifico che è possibile eseguire: ApiController.Validate(). Aggiungendo queste righe al mio Test unità, imposta il valore ModelState come non valido e non genera un'eccezione.

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

Nulla nel percorso di esecuzione causa la convalida. Questo viene fatto come parte del binding del modello, cosa che non stai facendo mentre stai creando manualmente l'istanza del modello.