PR comments commit
This commit is contained in:
parent
070be7b656
commit
02cc82a055
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue