PR comments commit

This commit is contained in:
Doug Bunting 2015-08-21 10:45:43 -07:00
parent 070be7b656
commit 02cc82a055
3 changed files with 106 additions and 41 deletions

View File

@ -3,7 +3,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
@ -313,9 +312,16 @@ namespace Microsoft.AspNet.Mvc
var modelValidationContext = new ModelValidationContext(modelBindingContext, modelExplorer);
var validationNode = modelBindingResult.ValidationNode;
Debug.Assert(
validationNode != null,
"ValidationNode should never be null in a successful ModelBindingResult.");
if (validationNode == null)
{
validationNode = new ModelValidationNode(
modelBindingResult.Key,
modelMetadata,
modelBindingResult.Model)
{
ValidateAllProperties = true,
};
}
objectModelValidator.Validate(modelValidationContext, validationNode);

View File

@ -52,7 +52,7 @@ namespace Microsoft.AspNet.Mvc.Test
GetCompositeBinder(binder.Object),
Mock.Of<IValueProvider>(),
new List<IInputFormatter>(),
new DefaultObjectValidator(new IExcludeTypeValidationFilter[0], metadataProvider),
new Mock<IObjectModelValidator>(MockBehavior.Strict).Object,
Mock.Of<IModelValidatorProvider>());
// Assert
@ -164,7 +164,7 @@ namespace Microsoft.AspNet.Mvc.Test
GetCompositeBinder(binder.Object),
Mock.Of<IValueProvider>(),
new List<IInputFormatter>(),
Mock.Of<IObjectModelValidator>(),
new Mock<IObjectModelValidator>(MockBehavior.Strict).Object,
Mock.Of<IModelValidatorProvider>(),
includePredicate);
@ -245,17 +245,17 @@ namespace Microsoft.AspNet.Mvc.Test
// Act
var result = await ModelBindingHelper.TryUpdateModelAsync(
model,
null,
Mock.Of<HttpContext>(),
new ModelStateDictionary(),
metadataProvider,
GetCompositeBinder(binder.Object),
Mock.Of<IValueProvider>(),
new List<IInputFormatter>(),
Mock.Of<IObjectModelValidator>(),
Mock.Of<IModelValidatorProvider>(),
m => m.IncludedProperty );
model,
null,
Mock.Of<HttpContext>(),
new ModelStateDictionary(),
metadataProvider,
GetCompositeBinder(binder.Object),
Mock.Of<IValueProvider>(),
new List<IInputFormatter>(),
new Mock<IObjectModelValidator>(MockBehavior.Strict).Object,
Mock.Of<IModelValidatorProvider>(),
m => m.IncludedProperty );
// Assert
Assert.False(result);
@ -502,18 +502,18 @@ namespace Microsoft.AspNet.Mvc.Test
// Act
var result = await ModelBindingHelper.TryUpdateModelAsync(
model,
model.GetType(),
prefix: null,
httpContext: Mock.Of<HttpContext>(),
modelState: new ModelStateDictionary(),
metadataProvider: metadataProvider,
modelBinder: GetCompositeBinder(binder.Object),
valueProvider: Mock.Of<IValueProvider>(),
inputFormatters: new List<IInputFormatter>(),
objectModelValidator: Mock.Of<IObjectModelValidator>(),
validatorProvider: Mock.Of<IModelValidatorProvider>(),
predicate: includePredicate);
model,
model.GetType(),
prefix: null,
httpContext: Mock.Of<HttpContext>(),
modelState: new ModelStateDictionary(),
metadataProvider: metadataProvider,
modelBinder: GetCompositeBinder(binder.Object),
valueProvider: Mock.Of<IValueProvider>(),
inputFormatters: new List<IInputFormatter>(),
objectModelValidator: new Mock<IObjectModelValidator>(MockBehavior.Strict).Object,
validatorProvider: Mock.Of<IModelValidatorProvider>(),
predicate: includePredicate);
// Assert
Assert.False(result);
@ -596,17 +596,17 @@ namespace Microsoft.AspNet.Mvc.Test
// Act
var result = await ModelBindingHelper.TryUpdateModelAsync(
model,
modelType: model.GetType(),
prefix: null,
httpContext: Mock.Of<HttpContext>(),
modelState: new ModelStateDictionary(),
metadataProvider: metadataProvider,
modelBinder: GetCompositeBinder(binder.Object),
valueProvider: Mock.Of<IValueProvider>(),
inputFormatters: new List<IInputFormatter>(),
objectModelValidator: Mock.Of<IObjectModelValidator>(),
validatorProvider: Mock.Of<IModelValidatorProvider>());
model,
modelType: model.GetType(),
prefix: null,
httpContext: Mock.Of<HttpContext>(),
modelState: new ModelStateDictionary(),
metadataProvider: metadataProvider,
modelBinder: GetCompositeBinder(binder.Object),
valueProvider: Mock.Of<IValueProvider>(),
inputFormatters: new List<IInputFormatter>(),
objectModelValidator: new Mock<IObjectModelValidator>(MockBehavior.Strict).Object,
validatorProvider: Mock.Of<IModelValidatorProvider>());
// Assert
Assert.False(result);

View File

@ -138,7 +138,8 @@ namespace Microsoft.AspNet.Mvc.IntegrationTests
Assert.True(result);
// Model
Assert.Collection(model,
Assert.Collection(
model,
element =>
{
Assert.Equal("One Name", element.Name);
@ -591,6 +592,64 @@ namespace Microsoft.AspNet.Mvc.IntegrationTests
Assert.Equal(ModelValidationState.Valid, state.ValidationState);
}
[Fact]
public async Task TryUpdateModel_TopLevelCollection_WithPrefix_BindsAfterClearing()
{
// Arrange
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
{
request.QueryString = QueryString.Create(new Dictionary<string, string>
{
{ "prefix[0].Name", "One Name" },
{ "prefix[1].Address.Street", "Two Street" },
});
});
var modelState = new ModelStateDictionary();
var model = new List<Person1>
{
new Person1
{
Name = "One",
Address = new Address
{
Street = "DefaultStreet",
City = "Toronto",
},
},
new Person1 { Name = "Two" },
new Person1 { Name = "Three" },
};
// Act
var result = await TryUpdateModel(model, "prefix", operationContext, modelState);
// Assert
Assert.True(result);
// Model
Assert.Collection(
model,
element =>
{
Assert.Equal("One Name", element.Name);
Assert.Null(element.Address);
},
element =>
{
Assert.Null(element.Name);
Assert.NotNull(element.Address);
Assert.Equal("Two Street", element.Address.Street);
Assert.Null(element.Address.City);
});
// ModelState
Assert.True(modelState.IsValid);
Assert.Equal(2, modelState.Count);
Assert.NotNull(modelState["prefix[0].Name"]);
Assert.NotNull(modelState["prefix[1].Address.Street"]);
}
[Fact]
public async Task TryUpdateModel_NestedPoco_WithPrefix_DoesNotTrounceUnboundValues()
{