Change IsValid method in ModelStateDictionary to GetValidationState
Fixes #400
This commit is contained in:
parent
1adcf14b3d
commit
a834928f1a
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue