Change IsValid method in ModelStateDictionary to GetValidationState

Fixes #400
This commit is contained in:
Pranav K 2014-05-13 12:52:43 -07:00
parent 1adcf14b3d
commit a834928f1a
4 changed files with 34 additions and 36 deletions

View File

@ -116,8 +116,9 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
{ {
var validationNode = (ModelValidationNode)sender; var validationNode = (ModelValidationNode)sender;
var modelState = e.ValidationContext.ModelState; var modelState = e.ValidationContext.ModelState;
var validationState = modelState.GetFieldValidationState(validationNode.ModelStateKey);
if (modelState.IsValidField(validationNode.ModelStateKey) == null) if (validationState == ModelValidationState.Unvalidated)
{ {
// TODO: Revive ModelBinderConfig // TODO: Revive ModelBinderConfig
// string errorMessage = ModelBinderConfig.ValueRequiredErrorMessageProvider(e.ValidationContext, modelMetadata, incomingValue); // string errorMessage = ModelBinderConfig.ValueRequiredErrorMessageProvider(e.ValidationContext, modelMetadata, incomingValue);
@ -270,7 +271,8 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
if (value == null) if (value == null)
{ {
var modelStateKey = dtoResult.ValidationNode.ModelStateKey; var modelStateKey = dtoResult.ValidationNode.ModelStateKey;
if (bindingContext.ModelState.IsValidField(modelStateKey) == null) var validationState = bindingContext.ModelState.GetFieldValidationState(modelStateKey);
if (validationState == ModelValidationState.Unvalidated)
{ {
if (requiredValidator != null) if (requiredValidator != null)
{ {
@ -299,7 +301,8 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
ex = targetInvocationException.InnerException; ex = targetInvocationException.InnerException;
} }
var modelStateKey = dtoResult.ValidationNode.ModelStateKey; 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); 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 // trying to set a non-nullable value type to null, need to make sure there's a message
var modelStateKey = dtoResult.ValidationNode.ModelStateKey; 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); dtoResult.ValidationNode.Validated += CreateNullCheckFailedHandler(propertyMetadata, value);
} }

View File

@ -89,21 +89,15 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
modelState.Errors.Add(errorMessage); modelState.Errors.Add(errorMessage);
} }
public bool? IsValidField([NotNull] string key) public ModelValidationState GetFieldValidationState([NotNull] string key)
{ {
var entries = DictionaryHelper.FindKeysWithPrefix(this, key); var entries = DictionaryHelper.FindKeysWithPrefix(this, key);
if (!entries.Any()) if (!entries.Any())
{ {
return null; return ModelValidationState.Unvalidated;
} }
var validity = GetValidity(entries); return GetValidity(entries);
if (validity == ModelValidationState.Unvalidated)
{
return null;
}
return validity == ModelValidationState.Valid;
} }
public void MarkFieldValid([NotNull] string key) public void MarkFieldValid([NotNull] string key)

View File

@ -124,7 +124,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
OnValidated(validatedEventArgs); OnValidated(validatedEventArgs);
var modelState = validationContext.ModelState; 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. // If a node or its subtree were not marked invalid, we can consider it valid at this point.
modelState.MarkFieldValid(ModelStateKey); modelState.MarkFieldValid(ModelStateKey);
@ -159,7 +159,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
// else we could end up with duplicate or irrelevant error messages. // else we could end up with duplicate or irrelevant error messages.
var propertyKeyRoot = ModelBindingHelper.CreatePropertyModelName(ModelStateKey, propertyMetadata.PropertyName); var propertyKeyRoot = ModelBindingHelper.CreatePropertyModelName(ModelStateKey, propertyMetadata.PropertyName);
if (modelState.IsValidField(propertyKeyRoot) == null) if (modelState.GetFieldValidationState(propertyKeyRoot) == ModelValidationState.Unvalidated)
{ {
var propertyValidators = GetValidators(validationContext, propertyMetadata); var propertyValidators = GetValidators(validationContext, propertyMetadata);
var propertyValidationContext = new ModelValidationContext(validationContext, propertyMetadata); var propertyValidationContext = new ModelValidationContext(validationContext, propertyMetadata);
@ -178,7 +178,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
private void ValidateThis(ModelValidationContext validationContext, ModelValidationNode parentNode) private void ValidateThis(ModelValidationContext validationContext, ModelValidationNode parentNode)
{ {
var modelState = validationContext.ModelState; 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 // If any item in the key's subtree has been identified as invalid, short-circuit
return; return;

View File

@ -63,48 +63,48 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
} }
[Fact] [Fact]
public void IsValidFieldReturnsNullIfDictionaryDoesNotContainKey() public void GetFieldValidationState_ReturnsUnvalidatedIfDictionaryDoesNotContainKey()
{ {
// Arrange // Arrange
var msd = new ModelStateDictionary(); var msd = new ModelStateDictionary();
// Act // Act
var isValid = msd.IsValidField("foo"); var validationState = msd.GetFieldValidationState("foo");
// Assert // Assert
Assert.Null(isValid); Assert.Equal(ModelValidationState.Unvalidated, validationState);
} }
[Fact] [Fact]
public void IsValidFieldReturnsFalseIfKeyChildContainsErrors() public void GetFieldValidationState_ReturnsInvalidIfKeyChildContainsErrors()
{ {
// Arrange // Arrange
var msd = new ModelStateDictionary(); var msd = new ModelStateDictionary();
msd.AddModelError("foo.bar", "error text"); msd.AddModelError("foo.bar", "error text");
// Act // Act
var isValid = msd.IsValidField("foo"); var validationState = msd.GetFieldValidationState("foo");
// Assert // Assert
Assert.Equal(false, isValid); Assert.Equal(ModelValidationState.Invalid, validationState);
} }
[Fact] [Fact]
public void IsValidFieldReturnsFalseIfKeyContainsErrors() public void GetFieldValidationState_ReturnsInvalidIfKeyContainsErrors()
{ {
// Arrange // Arrange
var msd = new ModelStateDictionary(); var msd = new ModelStateDictionary();
msd.AddModelError("foo", "error text"); msd.AddModelError("foo", "error text");
// Act // Act
var isValid = msd.IsValidField("foo"); var validationState = msd.GetFieldValidationState("foo");
// Assert // Assert
Assert.Equal(false, isValid); Assert.Equal(ModelValidationState.Invalid, validationState);
} }
[Fact] [Fact]
public void IsValidFieldReturnsTrueIfModelStateDoesNotContainErrors() public void GetFieldValidationState_ReturnsValidIfModelStateDoesNotContainErrors()
{ {
// Arrange // Arrange
var validState = new ModelState var validState = new ModelState
@ -118,10 +118,10 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
}; };
// Act // Act
var isValid = msd.IsValidField("foo"); var validationState = msd.GetFieldValidationState("foo");
// Assert // Assert
Assert.Equal(true, isValid); Assert.Equal(ModelValidationState.Valid, validationState);
} }
[Fact] [Fact]
@ -288,10 +288,10 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
dictionary.SetModelValue("user.Name", GetValueProviderResult()); dictionary.SetModelValue("user.Name", GetValueProviderResult());
// Act // Act
var isValidField = dictionary.IsValidField("not-user"); var validationState = dictionary.GetFieldValidationState("not-user");
// Assert // Assert
Assert.Equal(null, isValidField); Assert.Equal(ModelValidationState.Unvalidated, validationState);
} }
[Fact] [Fact]
@ -304,10 +304,10 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
dictionary.AddModelError("user.Age", "Age is not a valid int"); dictionary.AddModelError("user.Age", "Age is not a valid int");
// Act // Act
var isValidField = dictionary.IsValidField("user"); var validationState = dictionary.GetFieldValidationState("user");
// Assert // Assert
Assert.Equal(null, isValidField); Assert.Equal(ModelValidationState.Unvalidated, validationState);
} }
[Theory] [Theory]
@ -322,10 +322,10 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
dictionary.AddModelError("user.Age", "Age is not a valid int"); dictionary.AddModelError("user.Age", "Age is not a valid int");
// Act // Act
var isValidField = dictionary.IsValidField(key); var validationState = dictionary.GetFieldValidationState(key);
// Assert // Assert
Assert.Equal(false, isValidField); Assert.Equal(ModelValidationState.Invalid, validationState);
} }
[Fact] [Fact]
@ -337,10 +337,10 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
dictionary["user.Name"] = new ModelState { ValidationState = ModelValidationState.Valid }; dictionary["user.Name"] = new ModelState { ValidationState = ModelValidationState.Valid };
// Act // Act
var isValidField = dictionary.IsValidField("user"); var validationState = dictionary.GetFieldValidationState("user");
// Assert // Assert
Assert.Equal(true, isValidField); Assert.Equal(ModelValidationState.Valid, validationState);
} }
private static ValueProviderResult GetValueProviderResult(object rawValue = null, string attemptedValue = null) private static ValueProviderResult GetValueProviderResult(object rawValue = null, string attemptedValue = null)