diff --git a/src/Microsoft.AspNet.Mvc.ModelBinding/Validation/ModelValidationNode.cs b/src/Microsoft.AspNet.Mvc.ModelBinding/Validation/ModelValidationNode.cs index 74009f8d87..c5a577149e 100644 --- a/src/Microsoft.AspNet.Mvc.ModelBinding/Validation/ModelValidationNode.cs +++ b/src/Microsoft.AspNet.Mvc.ModelBinding/Validation/ModelValidationNode.cs @@ -190,11 +190,9 @@ namespace Microsoft.AspNet.Mvc.ModelBinding // If the Model at the current node is null and there is no parent, we cannot validate, and the // DataAnnotationsModelValidator will throw. So we intercept here to provide a catch-all value-required // validation error - var modelStateKey = ModelBindingHelper.CreatePropertyModelName(ModelStateKey, - ModelMetadata.GetDisplayName()); if (parentNode == null && ModelMetadata.Model == null) { - modelState.TryAddModelError(modelStateKey, Resources.Validation_ValueNotFound); + modelState.TryAddModelError(ModelStateKey, Resources.Validation_ValueNotFound); return; } diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/ModelBindingFromHeaderTest.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/ModelBindingFromHeaderTest.cs index d578524d07..437e72f10f 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/ModelBindingFromHeaderTest.cs +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/ModelBindingFromHeaderTest.cs @@ -96,10 +96,9 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests Assert.Null(result.HeaderValue); Assert.Null(result.HeaderValues); - - // This is a bug - the model state error key is wrong here. + var error = Assert.Single(result.ModelStateErrors); - Assert.Equal("transactionId.transactionId", error); + Assert.Equal("transactionId", error); } // The action that this test hits will echo back the model-bound values diff --git a/test/Microsoft.AspNet.Mvc.ModelBinding.Test/Validation/ModelValidationNodeTest.cs b/test/Microsoft.AspNet.Mvc.ModelBinding.Test/Validation/ModelValidationNodeTest.cs index 4825e972aa..5bb344a2c6 100644 --- a/test/Microsoft.AspNet.Mvc.ModelBinding.Test/Validation/ModelValidationNodeTest.cs +++ b/test/Microsoft.AspNet.Mvc.ModelBinding.Test/Validation/ModelValidationNodeTest.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. #if ASPNET50 +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; @@ -245,6 +246,27 @@ namespace Microsoft.AspNet.Mvc.ModelBinding Assert.Empty(log); } + [Fact] + public void Validate_ValidatesIfModelIsNull() + { + // Arrange + var modelMetadata = GetModelMetadata(typeof(ValidateAllPropertiesModel)); + var node = new ModelValidationNode(modelMetadata, "theKey"); + + var context = CreateContext(modelMetadata); + + // Act + node.Validate(context); + + // Assert + var modelState = Assert.Single(context.ModelState); + Assert.Equal("theKey", modelState.Key); + Assert.Equal(ModelValidationState.Invalid, modelState.Value.ValidationState); + + var error = Assert.Single(modelState.Value.Errors); + Assert.Equal("A value is required but was not present in the request.", error.ErrorMessage); + } + [Fact] [ReplaceCulture] public void Validate_ValidateAllProperties_AddsValidationErrors() @@ -321,6 +343,11 @@ namespace Microsoft.AspNet.Mvc.ModelBinding return new DataAnnotationsModelMetadataProvider().GetMetadataForType(() => o, o.GetType()); } + private static ModelMetadata GetModelMetadata(Type type) + { + return new DataAnnotationsModelMetadataProvider().GetMetadataForType(modelAccessor: null, modelType: type); + } + private static ModelValidationContext CreateContext(ModelMetadata metadata = null) { var providers = new IModelValidatorProvider[]