diff --git a/src/Microsoft.AspNet.Mvc.ModelBinding/Binders/MutableObjectModelBinder.cs b/src/Microsoft.AspNet.Mvc.ModelBinding/Binders/MutableObjectModelBinder.cs index b79ace0f9c..d5fc61e392 100644 --- a/src/Microsoft.AspNet.Mvc.ModelBinding/Binders/MutableObjectModelBinder.cs +++ b/src/Microsoft.AspNet.Mvc.ModelBinding/Binders/MutableObjectModelBinder.cs @@ -116,8 +116,9 @@ namespace Microsoft.AspNet.Mvc.ModelBinding { var validationNode = (ModelValidationNode)sender; var modelState = e.ValidationContext.ModelState; + var validationState = modelState.GetFieldValidationState(validationNode.ModelStateKey); - if (modelState.IsValidField(validationNode.ModelStateKey) == null) + if (validationState == ModelValidationState.Unvalidated) { // TODO: Revive ModelBinderConfig // string errorMessage = ModelBinderConfig.ValueRequiredErrorMessageProvider(e.ValidationContext, modelMetadata, incomingValue); @@ -270,7 +271,8 @@ namespace Microsoft.AspNet.Mvc.ModelBinding if (value == null) { var modelStateKey = dtoResult.ValidationNode.ModelStateKey; - if (bindingContext.ModelState.IsValidField(modelStateKey) == null) + var validationState = bindingContext.ModelState.GetFieldValidationState(modelStateKey); + if (validationState == ModelValidationState.Unvalidated) { if (requiredValidator != null) { @@ -299,7 +301,8 @@ namespace Microsoft.AspNet.Mvc.ModelBinding ex = targetInvocationException.InnerException; } var modelStateKey = dtoResult.ValidationNode.ModelStateKey; - if (bindingContext.ModelState.IsValidField(modelStateKey) == null) + var validationState = bindingContext.ModelState.GetFieldValidationState(modelStateKey); + if (validationState == ModelValidationState.Unvalidated) { bindingContext.ModelState.AddModelError(modelStateKey, ex); } @@ -309,7 +312,8 @@ namespace Microsoft.AspNet.Mvc.ModelBinding { // trying to set a non-nullable value type to null, need to make sure there's a message var modelStateKey = dtoResult.ValidationNode.ModelStateKey; - if (bindingContext.ModelState.IsValidField(modelStateKey) == null) + var validationState = bindingContext.ModelState.GetFieldValidationState(modelStateKey); + if (validationState == ModelValidationState.Unvalidated) { dtoResult.ValidationNode.Validated += CreateNullCheckFailedHandler(propertyMetadata, value); } diff --git a/src/Microsoft.AspNet.Mvc.ModelBinding/ModelStateDictionary.cs b/src/Microsoft.AspNet.Mvc.ModelBinding/ModelStateDictionary.cs index 0fe53eb24e..872358f1fd 100644 --- a/src/Microsoft.AspNet.Mvc.ModelBinding/ModelStateDictionary.cs +++ b/src/Microsoft.AspNet.Mvc.ModelBinding/ModelStateDictionary.cs @@ -89,21 +89,15 @@ namespace Microsoft.AspNet.Mvc.ModelBinding modelState.Errors.Add(errorMessage); } - public bool? IsValidField([NotNull] string key) + public ModelValidationState GetFieldValidationState([NotNull] string key) { var entries = DictionaryHelper.FindKeysWithPrefix(this, key); if (!entries.Any()) { - return null; + return ModelValidationState.Unvalidated; } - var validity = GetValidity(entries); - if (validity == ModelValidationState.Unvalidated) - { - return null; - } - - return validity == ModelValidationState.Valid; + return GetValidity(entries); } public void MarkFieldValid([NotNull] string key) diff --git a/src/Microsoft.AspNet.Mvc.ModelBinding/Validation/ModelValidationNode.cs b/src/Microsoft.AspNet.Mvc.ModelBinding/Validation/ModelValidationNode.cs index f392f4d49e..cfa84b6399 100644 --- a/src/Microsoft.AspNet.Mvc.ModelBinding/Validation/ModelValidationNode.cs +++ b/src/Microsoft.AspNet.Mvc.ModelBinding/Validation/ModelValidationNode.cs @@ -124,7 +124,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding OnValidated(validatedEventArgs); var modelState = validationContext.ModelState; - if (modelState.IsValidField(ModelStateKey) != false) + if (modelState.GetFieldValidationState(ModelStateKey) != ModelValidationState.Invalid) { // If a node or its subtree were not marked invalid, we can consider it valid at this point. modelState.MarkFieldValid(ModelStateKey); @@ -159,7 +159,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding // else we could end up with duplicate or irrelevant error messages. var propertyKeyRoot = ModelBindingHelper.CreatePropertyModelName(ModelStateKey, propertyMetadata.PropertyName); - if (modelState.IsValidField(propertyKeyRoot) == null) + if (modelState.GetFieldValidationState(propertyKeyRoot) == ModelValidationState.Unvalidated) { var propertyValidators = GetValidators(validationContext, propertyMetadata); var propertyValidationContext = new ModelValidationContext(validationContext, propertyMetadata); @@ -178,7 +178,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding private void ValidateThis(ModelValidationContext validationContext, ModelValidationNode parentNode) { var modelState = validationContext.ModelState; - if (modelState.IsValidField(ModelStateKey) == false) + if (modelState.GetFieldValidationState(ModelStateKey) == ModelValidationState.Invalid) { // If any item in the key's subtree has been identified as invalid, short-circuit return; diff --git a/test/Microsoft.AspNet.Mvc.ModelBinding.Test/Validation/ModelStateDictionaryTest.cs b/test/Microsoft.AspNet.Mvc.ModelBinding.Test/Validation/ModelStateDictionaryTest.cs index 2811fe3648..dcc0cdcba4 100644 --- a/test/Microsoft.AspNet.Mvc.ModelBinding.Test/Validation/ModelStateDictionaryTest.cs +++ b/test/Microsoft.AspNet.Mvc.ModelBinding.Test/Validation/ModelStateDictionaryTest.cs @@ -63,48 +63,48 @@ namespace Microsoft.AspNet.Mvc.ModelBinding } [Fact] - public void IsValidFieldReturnsNullIfDictionaryDoesNotContainKey() + public void GetFieldValidationState_ReturnsUnvalidatedIfDictionaryDoesNotContainKey() { // Arrange var msd = new ModelStateDictionary(); // Act - var isValid = msd.IsValidField("foo"); + var validationState = msd.GetFieldValidationState("foo"); // Assert - Assert.Null(isValid); + Assert.Equal(ModelValidationState.Unvalidated, validationState); } [Fact] - public void IsValidFieldReturnsFalseIfKeyChildContainsErrors() + public void GetFieldValidationState_ReturnsInvalidIfKeyChildContainsErrors() { // Arrange var msd = new ModelStateDictionary(); msd.AddModelError("foo.bar", "error text"); // Act - var isValid = msd.IsValidField("foo"); + var validationState = msd.GetFieldValidationState("foo"); // Assert - Assert.Equal(false, isValid); + Assert.Equal(ModelValidationState.Invalid, validationState); } [Fact] - public void IsValidFieldReturnsFalseIfKeyContainsErrors() + public void GetFieldValidationState_ReturnsInvalidIfKeyContainsErrors() { // Arrange var msd = new ModelStateDictionary(); msd.AddModelError("foo", "error text"); // Act - var isValid = msd.IsValidField("foo"); + var validationState = msd.GetFieldValidationState("foo"); // Assert - Assert.Equal(false, isValid); + Assert.Equal(ModelValidationState.Invalid, validationState); } [Fact] - public void IsValidFieldReturnsTrueIfModelStateDoesNotContainErrors() + public void GetFieldValidationState_ReturnsValidIfModelStateDoesNotContainErrors() { // Arrange var validState = new ModelState @@ -118,10 +118,10 @@ namespace Microsoft.AspNet.Mvc.ModelBinding }; // Act - var isValid = msd.IsValidField("foo"); + var validationState = msd.GetFieldValidationState("foo"); // Assert - Assert.Equal(true, isValid); + Assert.Equal(ModelValidationState.Valid, validationState); } [Fact] @@ -288,10 +288,10 @@ namespace Microsoft.AspNet.Mvc.ModelBinding dictionary.SetModelValue("user.Name", GetValueProviderResult()); // Act - var isValidField = dictionary.IsValidField("not-user"); + var validationState = dictionary.GetFieldValidationState("not-user"); // Assert - Assert.Equal(null, isValidField); + Assert.Equal(ModelValidationState.Unvalidated, validationState); } [Fact] @@ -304,10 +304,10 @@ namespace Microsoft.AspNet.Mvc.ModelBinding dictionary.AddModelError("user.Age", "Age is not a valid int"); // Act - var isValidField = dictionary.IsValidField("user"); + var validationState = dictionary.GetFieldValidationState("user"); // Assert - Assert.Equal(null, isValidField); + Assert.Equal(ModelValidationState.Unvalidated, validationState); } [Theory] @@ -322,10 +322,10 @@ namespace Microsoft.AspNet.Mvc.ModelBinding dictionary.AddModelError("user.Age", "Age is not a valid int"); // Act - var isValidField = dictionary.IsValidField(key); + var validationState = dictionary.GetFieldValidationState(key); // Assert - Assert.Equal(false, isValidField); + Assert.Equal(ModelValidationState.Invalid, validationState); } [Fact] @@ -337,10 +337,10 @@ namespace Microsoft.AspNet.Mvc.ModelBinding dictionary["user.Name"] = new ModelState { ValidationState = ModelValidationState.Valid }; // Act - var isValidField = dictionary.IsValidField("user"); + var validationState = dictionary.GetFieldValidationState("user"); // Assert - Assert.Equal(true, isValidField); + Assert.Equal(ModelValidationState.Valid, validationState); } private static ValueProviderResult GetValueProviderResult(object rawValue = null, string attemptedValue = null)