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

View File

@ -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)

View File

@ -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;

View File

@ -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)