Skip to content

Commit 02cc82a

Browse files
committed
PR comments commit
1 parent 070be7b commit 02cc82a

File tree

3 files changed

+106
-41
lines changed

3 files changed

+106
-41
lines changed

src/Microsoft.AspNet.Mvc.Core/ModelBindingHelper.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
using System;
55
using System.Collections.Generic;
6-
using System.Diagnostics;
76
using System.Linq;
87
using System.Linq.Expressions;
98
using System.Reflection;
@@ -313,9 +312,16 @@ public static async Task<bool> TryUpdateModelAsync(
313312
var modelValidationContext = new ModelValidationContext(modelBindingContext, modelExplorer);
314313

315314
var validationNode = modelBindingResult.ValidationNode;
316-
Debug.Assert(
317-
validationNode != null,
318-
"ValidationNode should never be null in a successful ModelBindingResult.");
315+
if (validationNode == null)
316+
{
317+
validationNode = new ModelValidationNode(
318+
modelBindingResult.Key,
319+
modelMetadata,
320+
modelBindingResult.Model)
321+
{
322+
ValidateAllProperties = true,
323+
};
324+
}
319325

320326
objectModelValidator.Validate(modelValidationContext, validationNode);
321327

test/Microsoft.AspNet.Mvc.Core.Test/ModelBindingHelperTest.cs

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public async Task TryUpdateModel_ReturnsFalse_IfBinderIsUnsuccessful(ModelBindin
5252
GetCompositeBinder(binder.Object),
5353
Mock.Of<IValueProvider>(),
5454
new List<IInputFormatter>(),
55-
new DefaultObjectValidator(new IExcludeTypeValidationFilter[0], metadataProvider),
55+
new Mock<IObjectModelValidator>(MockBehavior.Strict).Object,
5656
Mock.Of<IModelValidatorProvider>());
5757

5858
// Assert
@@ -164,7 +164,7 @@ public async Task TryUpdateModel_UsingIncludePredicateOverload_ReturnsFalse_IfBi
164164
GetCompositeBinder(binder.Object),
165165
Mock.Of<IValueProvider>(),
166166
new List<IInputFormatter>(),
167-
Mock.Of<IObjectModelValidator>(),
167+
new Mock<IObjectModelValidator>(MockBehavior.Strict).Object,
168168
Mock.Of<IModelValidatorProvider>(),
169169
includePredicate);
170170

@@ -245,17 +245,17 @@ public async Task TryUpdateModel_UsingIncludeExpressionOverload_ReturnsFalse_IfB
245245

246246
// Act
247247
var result = await ModelBindingHelper.TryUpdateModelAsync(
248-
model,
249-
null,
250-
Mock.Of<HttpContext>(),
251-
new ModelStateDictionary(),
252-
metadataProvider,
253-
GetCompositeBinder(binder.Object),
254-
Mock.Of<IValueProvider>(),
255-
new List<IInputFormatter>(),
256-
Mock.Of<IObjectModelValidator>(),
257-
Mock.Of<IModelValidatorProvider>(),
258-
m => m.IncludedProperty );
248+
model,
249+
null,
250+
Mock.Of<HttpContext>(),
251+
new ModelStateDictionary(),
252+
metadataProvider,
253+
GetCompositeBinder(binder.Object),
254+
Mock.Of<IValueProvider>(),
255+
new List<IInputFormatter>(),
256+
new Mock<IObjectModelValidator>(MockBehavior.Strict).Object,
257+
Mock.Of<IModelValidatorProvider>(),
258+
m => m.IncludedProperty );
259259

260260
// Assert
261261
Assert.False(result);
@@ -502,18 +502,18 @@ public async Task TryUpdateModelNonGeneric_PredicateOverload_ReturnsFalse_IfBind
502502

503503
// Act
504504
var result = await ModelBindingHelper.TryUpdateModelAsync(
505-
model,
506-
model.GetType(),
507-
prefix: null,
508-
httpContext: Mock.Of<HttpContext>(),
509-
modelState: new ModelStateDictionary(),
510-
metadataProvider: metadataProvider,
511-
modelBinder: GetCompositeBinder(binder.Object),
512-
valueProvider: Mock.Of<IValueProvider>(),
513-
inputFormatters: new List<IInputFormatter>(),
514-
objectModelValidator: Mock.Of<IObjectModelValidator>(),
515-
validatorProvider: Mock.Of<IModelValidatorProvider>(),
516-
predicate: includePredicate);
505+
model,
506+
model.GetType(),
507+
prefix: null,
508+
httpContext: Mock.Of<HttpContext>(),
509+
modelState: new ModelStateDictionary(),
510+
metadataProvider: metadataProvider,
511+
modelBinder: GetCompositeBinder(binder.Object),
512+
valueProvider: Mock.Of<IValueProvider>(),
513+
inputFormatters: new List<IInputFormatter>(),
514+
objectModelValidator: new Mock<IObjectModelValidator>(MockBehavior.Strict).Object,
515+
validatorProvider: Mock.Of<IModelValidatorProvider>(),
516+
predicate: includePredicate);
517517

518518
// Assert
519519
Assert.False(result);
@@ -596,17 +596,17 @@ public async Task TryUpdateModelNonGeneric_ModelTypeOverload_ReturnsFalse_IfBind
596596

597597
// Act
598598
var result = await ModelBindingHelper.TryUpdateModelAsync(
599-
model,
600-
modelType: model.GetType(),
601-
prefix: null,
602-
httpContext: Mock.Of<HttpContext>(),
603-
modelState: new ModelStateDictionary(),
604-
metadataProvider: metadataProvider,
605-
modelBinder: GetCompositeBinder(binder.Object),
606-
valueProvider: Mock.Of<IValueProvider>(),
607-
inputFormatters: new List<IInputFormatter>(),
608-
objectModelValidator: Mock.Of<IObjectModelValidator>(),
609-
validatorProvider: Mock.Of<IModelValidatorProvider>());
599+
model,
600+
modelType: model.GetType(),
601+
prefix: null,
602+
httpContext: Mock.Of<HttpContext>(),
603+
modelState: new ModelStateDictionary(),
604+
metadataProvider: metadataProvider,
605+
modelBinder: GetCompositeBinder(binder.Object),
606+
valueProvider: Mock.Of<IValueProvider>(),
607+
inputFormatters: new List<IInputFormatter>(),
608+
objectModelValidator: new Mock<IObjectModelValidator>(MockBehavior.Strict).Object,
609+
validatorProvider: Mock.Of<IModelValidatorProvider>());
610610

611611
// Assert
612612
Assert.False(result);

test/Microsoft.AspNet.Mvc.IntegrationTests/TryUpdateModelIntegrationTest.cs

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ public async Task TryUpdateModel_TopLevelCollection_EmptyPrefix_BindsAfterCleari
138138
Assert.True(result);
139139

140140
// Model
141-
Assert.Collection(model,
141+
Assert.Collection(
142+
model,
142143
element =>
143144
{
144145
Assert.Equal("One Name", element.Name);
@@ -591,6 +592,64 @@ public async Task TryUpdateModel_ExistingModel_WithPrefix_GetsBound()
591592
Assert.Equal(ModelValidationState.Valid, state.ValidationState);
592593
}
593594

595+
[Fact]
596+
public async Task TryUpdateModel_TopLevelCollection_WithPrefix_BindsAfterClearing()
597+
{
598+
// Arrange
599+
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
600+
{
601+
request.QueryString = QueryString.Create(new Dictionary<string, string>
602+
{
603+
{ "prefix[0].Name", "One Name" },
604+
{ "prefix[1].Address.Street", "Two Street" },
605+
});
606+
});
607+
608+
var modelState = new ModelStateDictionary();
609+
var model = new List<Person1>
610+
{
611+
new Person1
612+
{
613+
Name = "One",
614+
Address = new Address
615+
{
616+
Street = "DefaultStreet",
617+
City = "Toronto",
618+
},
619+
},
620+
new Person1 { Name = "Two" },
621+
new Person1 { Name = "Three" },
622+
};
623+
624+
// Act
625+
var result = await TryUpdateModel(model, "prefix", operationContext, modelState);
626+
627+
// Assert
628+
Assert.True(result);
629+
630+
// Model
631+
Assert.Collection(
632+
model,
633+
element =>
634+
{
635+
Assert.Equal("One Name", element.Name);
636+
Assert.Null(element.Address);
637+
},
638+
element =>
639+
{
640+
Assert.Null(element.Name);
641+
Assert.NotNull(element.Address);
642+
Assert.Equal("Two Street", element.Address.Street);
643+
Assert.Null(element.Address.City);
644+
});
645+
646+
// ModelState
647+
Assert.True(modelState.IsValid);
648+
Assert.Equal(2, modelState.Count);
649+
Assert.NotNull(modelState["prefix[0].Name"]);
650+
Assert.NotNull(modelState["prefix[1].Address.Street"]);
651+
}
652+
594653
[Fact]
595654
public async Task TryUpdateModel_NestedPoco_WithPrefix_DoesNotTrounceUnboundValues()
596655
{

0 commit comments

Comments
 (0)