Validations with BindRequired on properties.
This commit is contained in:
parent
502b832d17
commit
f37f2ae352
|
|
@ -2,7 +2,6 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNet.Http;
|
using Microsoft.AspNet.Http;
|
||||||
using Microsoft.AspNet.Mvc.ModelBinding;
|
using Microsoft.AspNet.Mvc.ModelBinding;
|
||||||
|
|
@ -338,5 +337,204 @@ namespace Microsoft.AspNet.Mvc.IntegrationTests
|
||||||
Assert.Equal(0, modelState.ErrorCount);
|
Assert.Equal(0, modelState.ErrorCount);
|
||||||
Assert.True(modelState.IsValid);
|
Assert.True(modelState.IsValid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class Person2
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
[BindRequired]
|
||||||
|
public string Name { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task CollectionModelBinder_BindsListOfComplexType_WithRequiredProperty_WithPrefix_PartialData()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
ParameterType = typeof(List<Person2>)
|
||||||
|
};
|
||||||
|
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
request.QueryString = new QueryString("?parameter[0].Id=10¶meter[1].Id=11");
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult);
|
||||||
|
Assert.True(modelBindingResult.IsModelSet);
|
||||||
|
|
||||||
|
var model = Assert.IsType<List<Person2>>(modelBindingResult.Model);
|
||||||
|
Assert.Equal(10, model[0].Id);
|
||||||
|
Assert.Equal(11, model[1].Id);
|
||||||
|
Assert.Null(model[0].Name);
|
||||||
|
Assert.Null(model[1].Name);
|
||||||
|
|
||||||
|
Assert.Equal(4, modelState.Count);
|
||||||
|
Assert.Equal(2, modelState.ErrorCount);
|
||||||
|
Assert.False(modelState.IsValid);
|
||||||
|
|
||||||
|
var entry = Assert.Single(modelState, kvp => kvp.Key == "parameter[0].Id").Value;
|
||||||
|
Assert.Equal("10", entry.Value.AttemptedValue);
|
||||||
|
Assert.Equal("10", entry.Value.RawValue);
|
||||||
|
|
||||||
|
entry = Assert.Single(modelState, kvp => kvp.Key == "parameter[1].Id").Value;
|
||||||
|
Assert.Equal("11", entry.Value.AttemptedValue);
|
||||||
|
Assert.Equal("11", entry.Value.RawValue);
|
||||||
|
|
||||||
|
entry = Assert.Single(modelState, kvp => kvp.Key == "parameter[0].Name").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
Assert.Equal(ModelValidationState.Invalid, entry.ValidationState);
|
||||||
|
|
||||||
|
entry = Assert.Single(modelState, kvp => kvp.Key == "parameter[1].Name").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
Assert.Equal(ModelValidationState.Invalid, entry.ValidationState);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task CollectionModelBinder_BindsListOfComplexType_WithRequiredProperty_WithExplicitPrefix_PartialData()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
BindingInfo = new BindingInfo()
|
||||||
|
{
|
||||||
|
BinderModelName = "prefix",
|
||||||
|
},
|
||||||
|
ParameterType = typeof(List<Person2>)
|
||||||
|
};
|
||||||
|
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
request.QueryString = new QueryString("?prefix[0].Id=10&prefix[1].Id=11");
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult);
|
||||||
|
Assert.True(modelBindingResult.IsModelSet);
|
||||||
|
|
||||||
|
var model = Assert.IsType<List<Person2>>(modelBindingResult.Model);
|
||||||
|
Assert.Equal(10, model[0].Id);
|
||||||
|
Assert.Null(model[0].Name);
|
||||||
|
Assert.Equal(11, model[1].Id);
|
||||||
|
Assert.Null(model[1].Name);
|
||||||
|
|
||||||
|
Assert.Equal(4, modelState.Count);
|
||||||
|
Assert.Equal(2, modelState.ErrorCount);
|
||||||
|
Assert.False(modelState.IsValid);
|
||||||
|
|
||||||
|
var entry = Assert.Single(modelState, kvp => kvp.Key == "prefix[0].Id").Value;
|
||||||
|
Assert.Equal("10", entry.Value.AttemptedValue);
|
||||||
|
Assert.Equal("10", entry.Value.RawValue);
|
||||||
|
|
||||||
|
entry = Assert.Single(modelState, kvp => kvp.Key == "prefix[1].Id").Value;
|
||||||
|
Assert.Equal("11", entry.Value.AttemptedValue);
|
||||||
|
Assert.Equal("11", entry.Value.RawValue);
|
||||||
|
|
||||||
|
entry = Assert.Single(modelState, kvp => kvp.Key == "prefix[0].Name").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
Assert.Equal(ModelValidationState.Invalid, entry.ValidationState);
|
||||||
|
|
||||||
|
entry = Assert.Single(modelState, kvp => kvp.Key == "prefix[1].Name").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
Assert.Equal(ModelValidationState.Invalid, entry.ValidationState);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task CollectionModelBinder_BindsCollectionOfComplexType_WithRequiredProperty_EmptyPrefix_PartialData()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
ParameterType = typeof(ICollection<Person2>)
|
||||||
|
};
|
||||||
|
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
request.QueryString = new QueryString("?[0].Id=10&[1].Id=11");
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult);
|
||||||
|
Assert.True(modelBindingResult.IsModelSet);
|
||||||
|
|
||||||
|
var model = Assert.IsType<List<Person2>>(modelBindingResult.Model);
|
||||||
|
Assert.Equal(10, model[0].Id);
|
||||||
|
Assert.Null(model[0].Name);
|
||||||
|
Assert.Equal(11, model[1].Id);
|
||||||
|
Assert.Null(model[1].Name);
|
||||||
|
|
||||||
|
Assert.Equal(4, modelState.Count);
|
||||||
|
Assert.Equal(2, modelState.ErrorCount);
|
||||||
|
Assert.False(modelState.IsValid);
|
||||||
|
|
||||||
|
var entry = Assert.Single(modelState, kvp => kvp.Key == "[0].Id").Value;
|
||||||
|
Assert.Equal("10", entry.Value.AttemptedValue);
|
||||||
|
Assert.Equal("10", entry.Value.RawValue);
|
||||||
|
|
||||||
|
entry = Assert.Single(modelState, kvp => kvp.Key == "[1].Id").Value;
|
||||||
|
Assert.Equal("11", entry.Value.AttemptedValue);
|
||||||
|
Assert.Equal("11", entry.Value.RawValue);
|
||||||
|
|
||||||
|
entry = Assert.Single(modelState, kvp => kvp.Key == "[0].Name").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
Assert.Equal(ModelValidationState.Invalid, entry.ValidationState);
|
||||||
|
|
||||||
|
entry = Assert.Single(modelState, kvp => kvp.Key == "[1].Name").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
Assert.Equal(ModelValidationState.Invalid, entry.ValidationState);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact(Skip = "Empty collection should be created by the collection model binder #1579")]
|
||||||
|
public async Task CollectionModelBinder_BindsListOfComplexType_WithRequiredProperty_NoData()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
ParameterType = typeof(List<Person2>)
|
||||||
|
};
|
||||||
|
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
request.QueryString = new QueryString("?");
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult); // This fails due to #1579
|
||||||
|
Assert.False(modelBindingResult.IsModelSet);
|
||||||
|
Assert.Empty(Assert.IsType<List<Person2>>(modelBindingResult.Model));
|
||||||
|
|
||||||
|
Assert.Equal(0, modelState.Count);
|
||||||
|
Assert.Equal(0, modelState.ErrorCount);
|
||||||
|
Assert.True(modelState.IsValid);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
@ -1565,6 +1566,464 @@ namespace Microsoft.AspNet.Mvc.IntegrationTests
|
||||||
Assert.Same(model.Customer.Address, entry.Value.RawValue);
|
Assert.Same(model.Customer.Address, entry.Value.RawValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class Order10
|
||||||
|
{
|
||||||
|
[BindRequired]
|
||||||
|
public Person10 Customer { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Person10
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact(Skip = "Error message is incorrect #2493.")]
|
||||||
|
public async Task MutableObjectModelBinder_WithRequiredComplexProperty_NoData_GetsErrors()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
ParameterType = typeof(Order10)
|
||||||
|
};
|
||||||
|
|
||||||
|
// No Data
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult);
|
||||||
|
Assert.True(modelBindingResult.IsModelSet);
|
||||||
|
|
||||||
|
var model = Assert.IsType<Order10>(modelBindingResult.Model);
|
||||||
|
Assert.Null(model.Customer);
|
||||||
|
|
||||||
|
Assert.Equal(1, modelState.Count); // This fails due to #2446
|
||||||
|
Assert.Equal(1, modelState.ErrorCount);
|
||||||
|
Assert.False(modelState.IsValid);
|
||||||
|
|
||||||
|
var entry = Assert.Single(modelState, e => e.Key == "Customer").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
var error = Assert.Single(modelState["Customer"].Errors);
|
||||||
|
Assert.Equal("The Customer field is required.", error.ErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Order11
|
||||||
|
{
|
||||||
|
public Person11 Customer { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Person11
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
|
||||||
|
[BindRequired]
|
||||||
|
public string Name { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact(Skip = "Error message is incorrect #2493.")]
|
||||||
|
public async Task MutableObjectModelBinder_WithNestedRequiredProperty_WithPartialData_GetsErrors()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
ParameterType = typeof(Order11)
|
||||||
|
};
|
||||||
|
|
||||||
|
// No Data
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
request.QueryString = new QueryString("?parameter.Customer.Id=123");
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult);
|
||||||
|
Assert.True(modelBindingResult.IsModelSet);
|
||||||
|
|
||||||
|
var model = Assert.IsType<Order11>(modelBindingResult.Model);
|
||||||
|
Assert.NotNull(model.Customer);
|
||||||
|
Assert.Equal(123, model.Customer.Id);
|
||||||
|
Assert.Null(model.Customer.Name);
|
||||||
|
|
||||||
|
Assert.Equal(2, modelState.Count); // This fails due to #2446
|
||||||
|
Assert.Equal(1, modelState.ErrorCount);
|
||||||
|
Assert.False(modelState.IsValid);
|
||||||
|
|
||||||
|
var entry = Assert.Single(modelState, e => e.Key == "parameter.Customer.Id").Value;
|
||||||
|
Assert.NotNull(entry.Value);
|
||||||
|
Assert.Equal("123", entry.Value.RawValue);
|
||||||
|
Assert.Equal("123", entry.Value.AttemptedValue);
|
||||||
|
|
||||||
|
entry = Assert.Single(modelState, e => e.Key == "parameter.Customer.Name").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
var error = Assert.Single(modelState["parameter.Customer.Name"].Errors);
|
||||||
|
Assert.Equal("The Name field is required.", error.ErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact(Skip = "Error message is incorrect #2493.")]
|
||||||
|
public async Task MutableObjectModelBinder_WithNestedRequiredProperty_WithData_EmptyPrefix_GetsErrors()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
ParameterType = typeof(Order11)
|
||||||
|
};
|
||||||
|
|
||||||
|
// No Data
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
request.QueryString = new QueryString("?Customer.Id=123");
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult);
|
||||||
|
Assert.True(modelBindingResult.IsModelSet);
|
||||||
|
|
||||||
|
var model = Assert.IsType<Order11>(modelBindingResult.Model);
|
||||||
|
Assert.NotNull(model.Customer);
|
||||||
|
Assert.Equal(123, model.Customer.Id);
|
||||||
|
Assert.Null(model.Customer.Name);
|
||||||
|
|
||||||
|
Assert.Equal(2, modelState.Count); // This fails due to #2446
|
||||||
|
Assert.Equal(1, modelState.ErrorCount);
|
||||||
|
Assert.False(modelState.IsValid);
|
||||||
|
|
||||||
|
var entry = Assert.Single(modelState, e => e.Key == "Customer.Id").Value;
|
||||||
|
Assert.NotNull(entry.Value);
|
||||||
|
Assert.Equal("123", entry.Value.RawValue);
|
||||||
|
Assert.Equal("123", entry.Value.AttemptedValue);
|
||||||
|
|
||||||
|
entry = Assert.Single(modelState, e => e.Key == "Customer.Name").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
var error = Assert.Single(modelState["Customer.Name"].Errors);
|
||||||
|
Assert.Equal("The Name field is required.", error.ErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact(Skip = "Error message is incorrect #2493.")]
|
||||||
|
public async Task MutableObjectModelBinder_WithNestedRequiredProperty_WithData_CustomPrefix_GetsErrors()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
ParameterType = typeof(Order11),
|
||||||
|
BindingInfo = new BindingInfo()
|
||||||
|
{
|
||||||
|
BinderModelName = "customParameter"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// No Data
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
request.QueryString = new QueryString("?customParameter.Customer.Id=123");
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult);
|
||||||
|
Assert.True(modelBindingResult.IsModelSet);
|
||||||
|
|
||||||
|
var model = Assert.IsType<Order11>(modelBindingResult.Model);
|
||||||
|
Assert.NotNull(model.Customer);
|
||||||
|
Assert.Equal(123, model.Customer.Id);
|
||||||
|
Assert.Null(model.Customer.Name);
|
||||||
|
|
||||||
|
Assert.Equal(2, modelState.Count); // This fails due to #2446
|
||||||
|
Assert.Equal(1, modelState.ErrorCount);
|
||||||
|
Assert.False(modelState.IsValid);
|
||||||
|
|
||||||
|
var entry = Assert.Single(modelState, e => e.Key == "customParameter.Customer.Id").Value;
|
||||||
|
Assert.NotNull(entry.Value);
|
||||||
|
Assert.Equal("123", entry.Value.RawValue);
|
||||||
|
Assert.Equal("123", entry.Value.AttemptedValue);
|
||||||
|
|
||||||
|
entry = Assert.Single(modelState, e => e.Key == "customParameter.Customer.Name").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
var error = Assert.Single(modelState["customParameter.Customer.Name"].Errors);
|
||||||
|
Assert.Equal("The Name field is required.", error.ErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Order12
|
||||||
|
{
|
||||||
|
[BindRequired]
|
||||||
|
public string ProductName { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact(Skip = "Error message is incorrect #2493.")]
|
||||||
|
public async Task MutableObjectModelBinder_WithRequiredProperty_NoData_GetsErrors()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
ParameterType = typeof(Order12)
|
||||||
|
};
|
||||||
|
|
||||||
|
// No Data
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
request.QueryString = new QueryString("?");
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult);
|
||||||
|
Assert.True(modelBindingResult.IsModelSet);
|
||||||
|
|
||||||
|
var model = Assert.IsType<Order12>(modelBindingResult.Model);
|
||||||
|
Assert.Null(model.ProductName);
|
||||||
|
|
||||||
|
Assert.Equal(1, modelState.Count); // This fails due to #2446
|
||||||
|
Assert.Equal(1, modelState.ErrorCount);
|
||||||
|
Assert.False(modelState.IsValid);
|
||||||
|
|
||||||
|
var entry = Assert.Single(modelState, e => e.Key == "ProductName").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
var error = Assert.Single(modelState["ProductName"].Errors);
|
||||||
|
Assert.Equal("The ProductName field is required.", error.ErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact(Skip = "Error message is incorrect #2493.")]
|
||||||
|
public async Task MutableObjectModelBinder_WithRequiredProperty_NoData_CustomPrefix_GetsErros()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
ParameterType = typeof(Order12),
|
||||||
|
BindingInfo = new BindingInfo()
|
||||||
|
{
|
||||||
|
BinderModelName = "customParameter"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// No Data
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
request.QueryString = new QueryString("?");
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult);
|
||||||
|
Assert.True(modelBindingResult.IsModelSet);
|
||||||
|
|
||||||
|
var model = Assert.IsType<Order12>(modelBindingResult.Model);
|
||||||
|
Assert.Null(model.ProductName);
|
||||||
|
|
||||||
|
Assert.Equal(1, modelState.Count);
|
||||||
|
Assert.Equal(1, modelState.ErrorCount);
|
||||||
|
Assert.False(modelState.IsValid);
|
||||||
|
|
||||||
|
var entry = Assert.Single(modelState, e => e.Key == "customParameter.ProductName").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
var error = Assert.Single(modelState["customParameter.ProductName"].Errors);
|
||||||
|
Assert.Equal("The ProductName field is required.", error.ErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact(Skip = "Extra model state entry due to #2446")]
|
||||||
|
public async Task MutableObjectModelBinder_WithRequiredProperty_WithData_EmptyPrefix_GetsBound()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
ParameterType = typeof(Order12),
|
||||||
|
};
|
||||||
|
|
||||||
|
// No Data
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
request.QueryString = new QueryString("?ProductName=abc");
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult);
|
||||||
|
Assert.True(modelBindingResult.IsModelSet);
|
||||||
|
|
||||||
|
var model = Assert.IsType<Order12>(modelBindingResult.Model);
|
||||||
|
Assert.Equal("abc", model.ProductName);
|
||||||
|
|
||||||
|
Assert.Equal(1, modelState.Count); // This fails due to #2446
|
||||||
|
Assert.Equal(0, modelState.ErrorCount);
|
||||||
|
Assert.True(modelState.IsValid);
|
||||||
|
|
||||||
|
var entry = Assert.Single(modelState, e => e.Key == "ProductName").Value;
|
||||||
|
Assert.NotNull(entry.Value);
|
||||||
|
Assert.Equal("abc", entry.Value.RawValue);
|
||||||
|
Assert.Equal("abc", entry.Value.AttemptedValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Order13
|
||||||
|
{
|
||||||
|
[BindRequired]
|
||||||
|
public List<int> OrderIds { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact(Skip = "Error message is incorrect #2493.")]
|
||||||
|
public async Task MutableObjectModelBinder_WithRequiredCollectionProperty_NoData_GetsErros()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
ParameterType = typeof(Order13)
|
||||||
|
};
|
||||||
|
|
||||||
|
// No Data
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
request.QueryString = new QueryString("?");
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult);
|
||||||
|
Assert.True(modelBindingResult.IsModelSet);
|
||||||
|
|
||||||
|
var model = Assert.IsType<Order13>(modelBindingResult.Model);
|
||||||
|
Assert.Null(model.OrderIds);
|
||||||
|
|
||||||
|
Assert.Equal(1, modelState.Count);
|
||||||
|
Assert.Equal(1, modelState.ErrorCount);
|
||||||
|
Assert.False(modelState.IsValid);
|
||||||
|
|
||||||
|
var entry = Assert.Single(modelState, e => e.Key == "OrderIds").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
var error = Assert.Single(modelState["OrderIds"].Errors);
|
||||||
|
Assert.Equal("The OrderIds field is required.", error.ErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact(Skip = "Error message is incorrect #2493.")]
|
||||||
|
public async Task MutableObjectModelBinder_WithRequiredCollectionProperty_NoData_CustomPrefix_GetsErros()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
ParameterType = typeof(Order13),
|
||||||
|
BindingInfo = new BindingInfo()
|
||||||
|
{
|
||||||
|
BinderModelName = "customParameter"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// No Data
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
request.QueryString = new QueryString("?");
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult);
|
||||||
|
Assert.True(modelBindingResult.IsModelSet);
|
||||||
|
|
||||||
|
var model = Assert.IsType<Order13>(modelBindingResult.Model);
|
||||||
|
Assert.Null(model.OrderIds);
|
||||||
|
|
||||||
|
Assert.Equal(1, modelState.Count);
|
||||||
|
Assert.Equal(1, modelState.ErrorCount);
|
||||||
|
Assert.False(modelState.IsValid);
|
||||||
|
|
||||||
|
var entry = Assert.Single(modelState, e => e.Key == "customParameter.OrderIds").Value;
|
||||||
|
Assert.Null(entry.Value);
|
||||||
|
var error = Assert.Single(modelState["customParameter.OrderIds"].Errors);
|
||||||
|
Assert.Equal("The OrderIds field is required.", error.ErrorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact(Skip = "Extra model state entry due to #2446")]
|
||||||
|
public async Task MutableObjectModelBinder_WithRequiredCollectionProperty_WithData_EmptyPrefix_GetsBound()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var argumentBinder = ModelBindingTestHelper.GetArgumentBinder();
|
||||||
|
var parameter = new ParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = "parameter",
|
||||||
|
ParameterType = typeof(Order13),
|
||||||
|
};
|
||||||
|
|
||||||
|
// No Data
|
||||||
|
var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
|
||||||
|
{
|
||||||
|
request.QueryString = new QueryString("?OrderIds[0]=123");
|
||||||
|
});
|
||||||
|
|
||||||
|
var modelState = new ModelStateDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(modelBindingResult);
|
||||||
|
Assert.True(modelBindingResult.IsModelSet);
|
||||||
|
|
||||||
|
var model = Assert.IsType<Order13>(modelBindingResult.Model);
|
||||||
|
Assert.Equal(new[] { 123 }, model.OrderIds.ToArray());
|
||||||
|
|
||||||
|
Assert.Equal(1, modelState.Count); // This fails due to #2446
|
||||||
|
Assert.Equal(0, modelState.ErrorCount);
|
||||||
|
Assert.True(modelState.IsValid);
|
||||||
|
|
||||||
|
var entry = Assert.Single(modelState, e => e.Key == "OrderIds[0]").Value;
|
||||||
|
Assert.NotNull(entry.Value);
|
||||||
|
Assert.Equal("123", entry.Value.RawValue);
|
||||||
|
Assert.Equal("123", entry.Value.AttemptedValue);
|
||||||
|
}
|
||||||
|
|
||||||
private static void SetJsonBodyContent(HttpRequest request, string content)
|
private static void SetJsonBodyContent(HttpRequest request, string content)
|
||||||
{
|
{
|
||||||
var stream = new MemoryStream(new UTF8Encoding(encoderShouldEmitUTF8Identifier: false).GetBytes(content));
|
var stream = new MemoryStream(new UTF8Encoding(encoderShouldEmitUTF8Identifier: false).GetBytes(content));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue