/// <summary> /// Clears <see cref="ModelStateDictionary"/> entries for <see cref="ModelMetadata"/>. /// </summary> /// <param name="modelMetadata">The <see cref="ModelMetadata"/>.</param> /// <param name="modelKey">The entry to clear. </param> /// <param name="modelMetadataProvider">The <see cref="IModelMetadataProvider"/>.</param> public static void ClearValidationStateForModel( [NotNull] Type modelType, [NotNull] ModelStateDictionary modelstate, [NotNull] IModelMetadataProvider metadataProvider, string modelKey) { // If modelkey is empty, we need to iterate through properties (obtained from ModelMetadata) and // clear validation state for all entries in ModelStateDictionary that start with each property name. // If modelkey is non-empty, clear validation state for all entries in ModelStateDictionary // that start with modelKey if (string.IsNullOrEmpty(modelKey)) { var modelMetadata = metadataProvider.GetMetadataForType(modelType); var elementMetadata = modelMetadata.ElementMetadata; if (elementMetadata != null) { modelMetadata = elementMetadata; } foreach (var property in modelMetadata.Properties) { var childKey = property.BinderModelName ?? property.PropertyName; modelstate.ClearValidationState(childKey); } } else { modelstate.ClearValidationState(modelKey); } }
/// <summary> /// Clears <see cref="ModelStateDictionary"/> entries for <see cref="ModelMetadata"/>. /// </summary> /// <param name="modelMetadata">The <see cref="ModelMetadata"/>.</param> /// <param name="modelState">The <see cref="ModelStateDictionary"/> associated with the model.</param> /// <param name="modelKey">The entry to clear. </param> public static void ClearValidationStateForModel( ModelMetadata modelMetadata, ModelStateDictionary modelState, string modelKey) { if (modelMetadata == null) { throw new ArgumentNullException(nameof(modelMetadata)); } if (modelState == null) { throw new ArgumentNullException(nameof(modelState)); } if (string.IsNullOrEmpty(modelKey)) { // If model key is empty, we have to do a best guess to try and clear the appropriate // keys. Clearing the empty prefix would clear the state of ALL entries, which might wipe out // data from other models. if (modelMetadata.IsEnumerableType) { // We expect that any key beginning with '[' is an index. We can't just infer the indexes // used, so we clear all keys that look like <empty prefix -> index>. // // In the unlikely case that multiple top-level collections where bound to the empty prefix, // you're just out of luck. foreach (var kvp in modelState) { if (kvp.Key.Length > 0 && kvp.Key[0] == '[') { // Starts with an indexer kvp.Value.Errors.Clear(); kvp.Value.ValidationState = ModelValidationState.Unvalidated; } } } else if (modelMetadata.IsComplexType) { for (var i = 0; i < modelMetadata.Properties.Count; i++) { var property = modelMetadata.Properties[i]; modelState.ClearValidationState(property.BinderModelName ?? property.PropertyName); } } else { // Simple types bind to a single entry. So clear the entry with the empty-key, in the // unlikely event that it has errors. var entry = modelState[string.Empty]; if (entry != null) { entry.Errors.Clear(); entry.ValidationState = ModelValidationState.Unvalidated; } } } else { // If model key is non-empty, we just want to clear all keys with that prefix. We expect // model binding to have only used this key (and suffixes) for all entries related to // this model. modelState.ClearValidationState(modelKey); } }
public void ModelStateDictionary_ClearsAllEntries_EmptyKey(string modelKey) { // Arrange var dictionary = new ModelStateDictionary(); dictionary["Property1"] = new ModelStateEntry { ValidationState = ModelValidationState.Valid }; dictionary["Property2"] = new ModelStateEntry { ValidationState = ModelValidationState.Invalid }; dictionary.AddModelError("Property2", "Property2 invalid."); dictionary["Property3"] = new ModelStateEntry { ValidationState = ModelValidationState.Invalid }; dictionary.AddModelError("Property3", "Property invalid."); dictionary["Property4"] = new ModelStateEntry { ValidationState = ModelValidationState.Skipped }; // Act dictionary.ClearValidationState(modelKey); // Assert Assert.Equal(0, dictionary["Property1"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Property1"].ValidationState); Assert.Equal(0, dictionary["Property2"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Property2"].ValidationState); Assert.Equal(0, dictionary["Property3"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Property3"].ValidationState); Assert.Equal(0, dictionary["Property4"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Property4"].ValidationState); }
public void ModelStateDictionary_ClearEntries_KeyHasDot_NonEmptyKey() { // Arrange var dictionary = new ModelStateDictionary(); dictionary["Product"] = new ModelStateEntry { ValidationState = ModelValidationState.Valid }; dictionary["Product.Detail1"] = new ModelStateEntry { ValidationState = ModelValidationState.Invalid }; dictionary.AddModelError("Product.Detail1", "Product Detail1 invalid."); dictionary["Product.Detail1.Name"] = new ModelStateEntry { ValidationState = ModelValidationState.Invalid }; dictionary.AddModelError("Product.Detail1.Name", "Product Detail1 Name invalid."); dictionary["Product.Detail1Name"] = new ModelStateEntry { ValidationState = ModelValidationState.Skipped }; // Act dictionary.ClearValidationState("Product.Detail1"); // Assert Assert.Equal(ModelValidationState.Valid, dictionary["Product"].ValidationState); Assert.Equal(0, dictionary["Product.Detail1"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Product.Detail1"].ValidationState); Assert.Equal(0, dictionary["Product.Detail1.Name"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Product.Detail1.Name"].ValidationState); Assert.Equal(ModelValidationState.Skipped, dictionary["Product.Detail1Name"].ValidationState); }
public void ModelStateDictionary_ClearEntriesPrefixedWithKey_NonEmptyKey() { // Arrange var dictionary = new ModelStateDictionary(); dictionary["Product"] = new ModelStateEntry { ValidationState = ModelValidationState.Valid }; dictionary["Product.Detail1"] = new ModelStateEntry { ValidationState = ModelValidationState.Invalid }; dictionary.AddModelError("Product.Detail1", "Product Detail1 invalid."); dictionary["Product.Detail2[0]"] = new ModelStateEntry { ValidationState = ModelValidationState.Invalid }; dictionary.AddModelError("Product.Detail2[0]", "Product Detail2[0] invalid."); dictionary["Product.Detail2[1]"] = new ModelStateEntry { ValidationState = ModelValidationState.Invalid }; dictionary.AddModelError("Product.Detail2[1]", "Product Detail2[1] invalid."); dictionary["Product.Detail2[2]"] = new ModelStateEntry { ValidationState = ModelValidationState.Skipped }; dictionary["Product.Detail3"] = new ModelStateEntry { ValidationState = ModelValidationState.Skipped }; dictionary["ProductName"] = new ModelStateEntry { ValidationState = ModelValidationState.Invalid }; dictionary.AddModelError("ProductName", "ProductName invalid."); // Act dictionary.ClearValidationState("Product"); // Assert Assert.Equal(0, dictionary["Product"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Product"].ValidationState); Assert.Equal(0, dictionary["Product.Detail1"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Product.Detail1"].ValidationState); Assert.Equal(0, dictionary["Product.Detail2[0]"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Product.Detail2[0]"].ValidationState); Assert.Equal(0, dictionary["Product.Detail2[1]"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Product.Detail2[1]"].ValidationState); Assert.Equal(0, dictionary["Product.Detail2[2]"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Product.Detail2[2]"].ValidationState); Assert.Equal(0, dictionary["Product.Detail3"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Product.Detail3"].ValidationState); Assert.Equal(1, dictionary["ProductName"].Errors.Count); Assert.Equal(ModelValidationState.Invalid, dictionary["ProductName"].ValidationState); }
public void ModelStateDictionary_ClearEntriesThatMatchWithKey_NonEmptyKey() { // Arrange var dictionary = new ModelStateDictionary(); dictionary["Property1"] = new ModelStateEntry { ValidationState = ModelValidationState.Valid }; dictionary["Property2"] = new ModelStateEntry { ValidationState = ModelValidationState.Invalid }; dictionary.AddModelError("Property2", "Property2 invalid."); dictionary["Property3"] = new ModelStateEntry { ValidationState = ModelValidationState.Invalid }; dictionary.AddModelError("Property3", "Property invalid."); dictionary["Property4"] = new ModelStateEntry { ValidationState = ModelValidationState.Skipped }; // Act dictionary.ClearValidationState("Property1"); dictionary.ClearValidationState("Property2"); dictionary.ClearValidationState("Property4"); // Assert Assert.Equal(0, dictionary["Property1"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Property1"].ValidationState); Assert.Equal(0, dictionary["Property2"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Property2"].ValidationState); Assert.Equal(1, dictionary["Property3"].Errors.Count); Assert.Equal(ModelValidationState.Invalid, dictionary["Property3"].ValidationState); Assert.Equal(0, dictionary["Property4"].Errors.Count); Assert.Equal(ModelValidationState.Unvalidated, dictionary["Property4"].ValidationState); }
public static ModelStateDictionary ClearKey(this ModelStateDictionary modelState, string key) { modelState.ClearValidationState(key); modelState.MarkFieldValid(key); return(modelState); }