Skip to content
This repository has been archived by the owner on Dec 14, 2018. It is now read-only.

Commit

Permalink
PR comments commit
Browse files Browse the repository at this point in the history
  • Loading branch information
dougbu committed Aug 21, 2015
1 parent 070be7b commit 02cc82a
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 41 deletions.
14 changes: 10 additions & 4 deletions src/Microsoft.AspNet.Mvc.Core/ModelBindingHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
Expand Down Expand Up @@ -313,9 +312,16 @@ public static async Task<bool> TryUpdateModelAsync(
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);

Expand Down
72 changes: 36 additions & 36 deletions test/Microsoft.AspNet.Mvc.Core.Test/ModelBindingHelperTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public async Task TryUpdateModel_ReturnsFalse_IfBinderIsUnsuccessful(ModelBindin
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
Expand Down Expand Up @@ -164,7 +164,7 @@ public async Task TryUpdateModel_UsingIncludePredicateOverload_ReturnsFalse_IfBi
GetCompositeBinder(binder.Object),
Mock.Of<IValueProvider>(),
new List<IInputFormatter>(),
Mock.Of<IObjectModelValidator>(),
new Mock<IObjectModelValidator>(MockBehavior.Strict).Object,
Mock.Of<IModelValidatorProvider>(),
includePredicate);

Expand Down Expand Up @@ -245,17 +245,17 @@ public async Task TryUpdateModel_UsingIncludeExpressionOverload_ReturnsFalse_IfB

// 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);
Expand Down Expand Up @@ -502,18 +502,18 @@ public async Task TryUpdateModelNonGeneric_PredicateOverload_ReturnsFalse_IfBind

// 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);
Expand Down Expand Up @@ -596,17 +596,17 @@ public async Task TryUpdateModelNonGeneric_ModelTypeOverload_ReturnsFalse_IfBind

// 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,8 @@ public async Task TryUpdateModel_TopLevelCollection_EmptyPrefix_BindsAfterCleari
Assert.True(result);

// Model
Assert.Collection(model,
Assert.Collection(
model,
element =>
{
Assert.Equal("One Name", element.Name);
Expand Down Expand Up @@ -591,6 +592,64 @@ public async Task TryUpdateModel_ExistingModel_WithPrefix_GetsBound()
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()
{
Expand Down

0 comments on commit 02cc82a

Please sign in to comment.