コード例 #1
0
        public async Task BindParameter_WithEmptyData_AndPerTypeMessage_AddsGivenMessage(Type parameterType)
        {
            // Arrange
            var metadataProvider = new TestModelMetadataProvider();

            metadataProvider
            .ForType(parameterType)
            .BindingDetails((Action <ModelBinding.Metadata.BindingMetadata>)(binding =>
            {
                // A real details provider could customize message based on BindingMetadataProviderContext.
                binding.ModelBindingMessageProvider.ValueMustNotBeNullAccessor =
                    value => $"Hurts when '{ value }' is provided.";
            }));
            var argumentBinder = new DefaultControllerActionArgumentBinder(
                metadataProvider,
                ModelBindingTestHelper.GetObjectValidator());
            var parameter = new ParameterDescriptor
            {
                Name        = "Parameter1",
                BindingInfo = new BindingInfo(),

                ParameterType = parameterType
            };
            var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
            {
                request.QueryString = QueryString.Create("Parameter1", string.Empty);
            });
            var modelState = new ModelStateDictionary();

            // Act
            var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);

            // Assert
            // ModelBindingResult
            Assert.False(modelBindingResult.IsModelSet);

            // Model
            Assert.Null(modelBindingResult.Model);

            // ModelState
            Assert.False(modelState.IsValid);
            var key = Assert.Single(modelState.Keys);

            Assert.Equal("Parameter1", key);
            Assert.Equal(string.Empty, modelState[key].AttemptedValue);
            Assert.Equal(string.Empty, modelState[key].RawValue);
            var error = Assert.Single(modelState[key].Errors);

            Assert.Equal("Hurts when '' is provided.", error.ErrorMessage, StringComparer.Ordinal);
            Assert.Null(error.Exception);
        }
コード例 #2
0
        private bool TryValidateModel(
            object model,
            string prefix,
            OperationBindingContext operationContext)
        {
            var controller = new TestController();

            controller.ControllerContext = new ControllerContext(operationContext.ActionContext);
            controller.ObjectValidator   = ModelBindingTestHelper.GetObjectValidator(operationContext.MetadataProvider);
            controller.MetadataProvider  = operationContext.MetadataProvider;
            controller.ControllerContext.ValidatorProviders = new[] { operationContext.ValidatorProvider }.ToList();

            return(controller.TryValidateModel(model, prefix));
        }
コード例 #3
0
        public async Task KeyValuePairModelBinder_SimpleTypes_WithNoValue_AndCustomizedMessage_AddsGivenMessage()
        {
            // Arrange
            var metadataProvider = new TestModelMetadataProvider();

            metadataProvider
            .ForType(typeof(KeyValuePair <string, int>))
            .BindingDetails((System.Action <ModelBinding.Metadata.BindingMetadata>)(binding =>
            {
                // A real details provider could customize message based on BindingMetadataProviderContext.
                binding.ModelBindingMessageProvider.MissingKeyOrValueAccessor = () => $"Hurts when nothing is provided.";
            }));
            var argumentBinder = new DefaultControllerActionArgumentBinder(
                metadataProvider,
                ModelBindingTestHelper.GetObjectValidator());

            var parameter = new ParameterDescriptor
            {
                Name          = "parameter",
                ParameterType = typeof(KeyValuePair <string, int>)
            };
            var operationContext = ModelBindingTestHelper.GetOperationBindingContext(request =>
            {
                request.QueryString = new QueryString("?parameter.Key=10");
            });
            var modelState = new ModelStateDictionary();

            // Act
            var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext);

            // Assert
            Assert.False(modelBindingResult.IsModelSet);
            Assert.Equal(2, modelState.Count);

            Assert.False(modelState.IsValid);
            Assert.Equal(1, modelState.ErrorCount);

            var entry = Assert.Single(modelState, kvp => kvp.Key == "parameter.Key").Value;

            Assert.Empty(entry.Errors);
            Assert.Equal("10", entry.AttemptedValue);
            Assert.Equal("10", entry.RawValue);

            entry = Assert.Single(modelState, kvp => kvp.Key == "parameter.Value").Value;
            var error = Assert.Single(entry.Errors);

            Assert.Null(error.Exception);
            Assert.Equal("Hurts when nothing is provided.", error.ErrorMessage);
        }
コード例 #4
0
 private Task <bool> TryUpdateModel(
     object model,
     string prefix,
     OperationBindingContext operationContext)
 {
     return(ModelBindingHelper.TryUpdateModelAsync(
                model,
                model.GetType(),
                prefix,
                operationContext.ActionContext,
                operationContext.MetadataProvider,
                operationContext.ModelBinder,
                operationContext.ValueProvider,
                operationContext.InputFormatters,
                ModelBindingTestHelper.GetObjectValidator(operationContext.MetadataProvider),
                operationContext.ValidatorProvider));
 }