public async Task BindModel()
        {
            // Arrange
            var metadataProvider = new EmptyModelMetadataProvider();
            ModelBindingContext bindingContext = new ModelBindingContext
            {
                ModelMetadata = metadataProvider.GetMetadataForType(typeof(IDictionary<int, string>)),
                ModelName = "someName",
                ValueProvider = new SimpleHttpValueProvider
                {
                    { "someName[0]", new KeyValuePair<int, string>(42, "forty-two") },
                    { "someName[1]", new KeyValuePair<int, string>(84, "eighty-four") }
                },
                OperationBindingContext = new OperationBindingContext
                {
                    ModelBinder = CreateKvpBinder(),
                    MetadataProvider = metadataProvider
                }
            };
            var binder = new DictionaryModelBinder<int, string>();

            // Act
            var retVal = await binder.BindModelAsync(bindingContext);

            // Assert
            Assert.NotNull(retVal);

            var dictionary = Assert.IsAssignableFrom<IDictionary<int, string>>(retVal.Model);
            Assert.NotNull(dictionary);
            Assert.Equal(2, dictionary.Count);
            Assert.Equal("forty-two", dictionary[42]);
            Assert.Equal("eighty-four", dictionary[84]);
        }
예제 #2
0
        private static DefaultModelBindingContext GetBindingContext(Type modelType, HttpContext httpContext)
        {
            var metadataProvider = new EmptyModelMetadataProvider();
            var bindingContext = new DefaultModelBindingContext
            {
                ActionContext = new ActionContext()
                {
                    HttpContext = httpContext,
                },
                ModelMetadata = metadataProvider.GetMetadataForType(modelType),
                ModelName = "file",
                ValidationState = new ValidationStateDictionary(),
            };

            return bindingContext;
        }
        private static DefaultModelBindingContext GetBindingContext(Type modelType)
        {
            var metadataProvider = new EmptyModelMetadataProvider();
            DefaultModelBindingContext bindingContext = new DefaultModelBindingContext
            {
                ActionContext = new ActionContext()
                {
                    HttpContext = new DefaultHttpContext(),
                },
                ModelMetadata = metadataProvider.GetMetadataForType(modelType),
                ModelName = "someName",
                ValueProvider = new SimpleValueProvider(),
                ValidationState = new ValidationStateDictionary(),
            };

            return bindingContext;
        }
        private static ModelBindingContext GetBindingContext(Type modelType)
        {
            var metadataProvider = new EmptyModelMetadataProvider();
            ModelBindingContext bindingContext = new ModelBindingContext
            {
                ModelMetadata = metadataProvider.GetMetadataForType(modelType),
                ModelName = "someName",
                ValueProvider = new SimpleHttpValueProvider(),
                OperationBindingContext = new OperationBindingContext
                {
                    ModelBinder = new CancellationTokenModelBinder(),
                    MetadataProvider = metadataProvider,
                    HttpContext = new DefaultHttpContext(),
                }
            };

            return bindingContext;
        }
예제 #5
0
        public async Task ReadAsync_AcceptsUTF16Characters()
        {
            // Arrange
            var expectedInt    = 10;
            var expectedString = "TestString";

            var input = "<?xml version=\"1.0\" encoding=\"UTF-16\"?>" +
                        "<TestLevelOne><SampleInt>" + expectedInt + "</SampleInt>" +
                        "<sampleString>" + expectedString + "</sampleString></TestLevelOne>";

            var formatter    = new XmlDataContractSerializerInputFormatter(new MvcOptions());
            var contentBytes = Encoding.Unicode.GetBytes(input);

            var modelState  = new ModelStateDictionary();
            var httpContext = GetHttpContext(contentBytes, contentType: "application/xml; charset=utf-16");

            var provider = new EmptyModelMetadataProvider();
            var metadata = provider.GetMetadataForType(typeof(TestLevelOne));
            var context  = new InputFormatterContext(
                httpContext,
                modelName: string.Empty,
                modelState: modelState,
                metadata: metadata,
                readerFactory: new TestHttpRequestStreamReaderFactory().CreateReader);

            // Act
            var result = await formatter.ReadAsync(context);

            // Assert
            Assert.NotNull(result);
            Assert.False(result.HasError);
            var model = Assert.IsType <TestLevelOne>(result.Model);

            Assert.Equal(expectedInt, model.SampleInt);
            Assert.Equal(expectedString, model.sampleString);
        }
예제 #6
0
        public void CanRead_ReturnsTrueForAnySupportedContentType(string requestContentType, bool expectedCanRead)
        {
            // Arrange
            var formatter    = new XmlSerializerInputFormatter(new MvcOptions());
            var contentBytes = Encoding.UTF8.GetBytes("content");

            var modelState  = new ModelStateDictionary();
            var httpContext = GetHttpContext(contentBytes, contentType: requestContentType);

            var provider         = new EmptyModelMetadataProvider();
            var metadata         = provider.GetMetadataForType(typeof(string));
            var formatterContext = new InputFormatterContext(
                httpContext,
                modelName: string.Empty,
                modelState: modelState,
                metadata: metadata,
                readerFactory: new TestHttpRequestStreamReaderFactory().CreateReader);

            // Act
            var result = formatter.CanRead(formatterContext);

            // Assert
            Assert.Equal(expectedCanRead, result);
        }
예제 #7
0
 public static ModelMetadata MetaData(this Type type)
 {
     return(Provider.GetMetadataForType(type));
 }
예제 #8
0
        private static ModelMetadata GetMetadata(Type modelType)
        {
            EmptyModelMetadataProvider provider = new EmptyModelMetadataProvider();

            return(provider.GetMetadataForType(null, modelType));
        }
 private static ModelBindingContext GetBindingContext(
     IValueProvider valueProvider,
     IModelBinder innerBinder = null,
     Type keyValuePairType = null)
 {
     var metataProvider = new EmptyModelMetadataProvider();
     var bindingContext = new ModelBindingContext
     {
         ModelMetadata = metataProvider.GetMetadataForType(keyValuePairType ?? typeof(KeyValuePair<int, string>)),
         ModelName = "someName",
         ValueProvider = valueProvider,
         OperationBindingContext = new OperationBindingContext
         {
             ModelBinder = innerBinder ?? CreateIntBinder(),
             MetadataProvider = metataProvider,
             ValidatorProvider = new DataAnnotationsModelValidatorProvider()
         }
     };
     return bindingContext;
 }
예제 #10
0
 private static ModelBindingContext GetBindingContext(IValueProvider valueProvider)
 {
     var metadataProvider = new EmptyModelMetadataProvider();
     ModelBindingContext bindingContext = new ModelBindingContext
     {
         ModelMetadata = metadataProvider.GetMetadataForType(null, typeof(int[])),
         ModelName = "someName",
         ValueProvider = valueProvider,
         ModelBinder = CreateIntBinder(),
         MetadataProvider = metadataProvider
     };
     return bindingContext;
 }
예제 #11
0
 private static ModelBindingContext GetBindingContext(IValueProvider valueProvider, Type modelType)
 {
     var metadataProvider = new EmptyModelMetadataProvider();
     var bindingContext = new ModelBindingContext
     {
         ModelMetadata = metadataProvider.GetMetadataForType(modelType),
         ModelName = "foo",
         ModelState = new ModelStateDictionary(),
         ValueProvider = valueProvider,
         OperationBindingContext  = new OperationBindingContext
         {
             MetadataProvider = metadataProvider,
         }
     };
     return bindingContext;
 }
예제 #12
0
        public async Task ProcessAsync_CallsGeneratorWithExpectedValues_ItemsAndMultiple(
            IEnumerable <SelectListItem> inputItems,
            string multiple,
            IEnumerable <SelectListItem> expectedItems,
            bool expectedAllowMultiple)
        {
            // Arrange
            var contextAttributes = new Dictionary <string, object>
            {
                // Attribute will be restored if value matches "multiple".
                { "multiple", multiple },
            };
            var originalAttributes = new Dictionary <string, string>();
            var propertyName       = "Property1";
            var expectedTagName    = "select";

            var tagHelperContext = new TagHelperContext(
                contextAttributes,
                uniqueId: "test",
                getChildContentAsync: () => Task.FromResult("Something"));
            var output = new TagHelperOutput(expectedTagName, originalAttributes);

            var    metadataProvider = new EmptyModelMetadataProvider();
            string model            = null;
            var    metadata         = metadataProvider.GetMetadataForType(() => model, typeof(string));

            var htmlGenerator = new Mock <IHtmlGenerator>(MockBehavior.Strict);
            var viewContext   = TestableHtmlGenerator.GetViewContext(model, htmlGenerator.Object, metadataProvider);

            // Simulate a (model => model) scenario. E.g. the calling helper may appear in a low-level template.
            var modelExpression = new ModelExpression(string.Empty, metadata);

            viewContext.ViewData.TemplateInfo.HtmlFieldPrefix = propertyName;

            ICollection <string> selectedValues = new string[0];

            htmlGenerator
            .Setup(real => real.GenerateSelect(
                       viewContext,
                       metadata,
                       null,         // optionLabel
                       string.Empty, // name
                       expectedItems,
                       expectedAllowMultiple,
                       null,      // htmlAttributes
                       out selectedValues))
            .Returns((TagBuilder)null)
            .Verifiable();

            var tagHelper = new SelectTagHelper
            {
                For         = modelExpression,
                Items       = inputItems,
                Generator   = htmlGenerator.Object,
                Multiple    = multiple,
                ViewContext = viewContext,
            };

            // Act
            await tagHelper.ProcessAsync(tagHelperContext, output);

            // Assert
            htmlGenerator.Verify();

            Assert.NotNull(viewContext.FormContext?.FormData);
            var keyValuePair = Assert.Single(
                viewContext.FormContext.FormData,
                entry => entry.Key == SelectTagHelper.SelectedValuesFormDataKey);

            Assert.Same(selectedValues, keyValuePair.Value);
        }
 private static ModelBindingContext GetModelBindingContext(IValueProvider valueProvider)
 {
     var metadataProvider = new EmptyModelMetadataProvider();
     var bindingContext = new ModelBindingContext
     {
         ModelMetadata = metadataProvider.GetMetadataForType(typeof(int)),
         ModelName = "someName",
         ValueProvider = valueProvider,
         OperationBindingContext = new OperationBindingContext
         {
             ModelBinder = CreateIntBinder(),
             MetadataProvider = metadataProvider
         }
     };
     return bindingContext;
 }
예제 #14
0
        public static ModelMetadata CreateModelMetadata <T>()
        {
            var provider = new EmptyModelMetadataProvider();

            return(provider.GetMetadataForType(null, typeof(T)));
        }
예제 #15
0
 private static ModelBindingContext GetBindingContext(IValueProvider valueProvider, IModelBinder innerBinder = null)
 {
     var metataProvider = new EmptyModelMetadataProvider();
     var bindingContext = new ModelBindingContext
     {
         ModelMetadata = metataProvider.GetMetadataForType(null, typeof(KeyValuePair<int, string>)),
         ModelName = "someName",
         ValueProvider = valueProvider,
         ModelBinder = innerBinder ?? CreateIntBinder(),
         MetadataProvider = metataProvider,
         ValidatorProviders = Enumerable.Empty<IModelValidatorProvider>()
     };
     return bindingContext;
 }
 private static ModelMetadata GetMetadata() {
     ModelMetadataProvider provider = new EmptyModelMetadataProvider();
     return provider.GetMetadataForType(null, typeof(object));
 }
 private static ModelBindingContext GetBindingContext(
     IValueProvider valueProvider,
     IModelBinder innerBinder = null,
     Type keyValuePairType = null)
 {
     var metataProvider = new EmptyModelMetadataProvider();
     var bindingContext = new ModelBindingContext
     {
         ModelMetadata = metataProvider.GetMetadataForType(
             keyValuePairType ?? typeof(KeyValuePair<int, string>)),
         ModelName = "someName",
         ModelState = new ModelStateDictionary(),
         ValueProvider = valueProvider,
         OperationBindingContext = new OperationBindingContext
         {
             ModelBinder = innerBinder ?? CreateIntBinder(),
             MetadataProvider = metataProvider,
             ValidatorProvider = new DataAnnotationsModelValidatorProvider(
                 new TestOptionsManager<MvcDataAnnotationsLocalizationOptions>(),
                 stringLocalizerFactory: null)
         }
     };
     return bindingContext;
 }
예제 #18
0
 public void AddValidation_ExistingInteger()
 {
     IModelMetadataProvider       provider   = new EmptyModelMetadataProvider();
     ModelMetadata                metadata   = provider.GetMetadataForType(typeof(Int64));
     Dictionary <String, String>  attributes = new() { ["data-val-integer"] = "Test" };
예제 #19
0
        public async Task ProcessAsync_CallsGeneratorWithExpectedValues_ItemsAndMultiple(
            IEnumerable <SelectListItem> inputItems,
            string multiple,
            IEnumerable <SelectListItem> expectedItems,
            bool expectedAllowMultiple)
        {
            // Arrange
            var contextAttributes = new Dictionary <string, object>
            {
                // Attribute will be restored if value matches "multiple".
                { "multiple", multiple },
            };
            var originalAttributes = new Dictionary <string, string>();
            var content            = "original content";
            var propertyName       = "Property1";
            var expectedTagName    = "select";

            var tagHelperContext = new TagHelperContext(contextAttributes);
            var output           = new TagHelperOutput(expectedTagName, originalAttributes, content);

            // TODO: https://github.com/aspnet/Mvc/issues/1253
            // In real (model => model) scenario, ModelExpression should have name "" and
            // TemplateInfo.HtmlFieldPrefix should be "Property1" but empty ModelExpression name is not currently
            // supported, see also #1408.
            var    metadataProvider = new EmptyModelMetadataProvider();
            string model            = null;
            var    metadata         = metadataProvider.GetMetadataForType(() => model, typeof(string));
            var    modelExpression  = new ModelExpression(propertyName, metadata);

            var htmlGenerator = new Mock <IHtmlGenerator>(MockBehavior.Strict);
            var viewContext   = TestableHtmlGenerator.GetViewContext(model, htmlGenerator.Object, metadataProvider);
            ICollection <string> selectedValues = new string[0];

            htmlGenerator
            .Setup(real => real.GenerateSelect(
                       viewContext,
                       metadata,
                       null,         // optionLabel
                       propertyName, // name
                       expectedItems,
                       expectedAllowMultiple,
                       null,      // htmlAttributes
                       out selectedValues))
            .Returns((TagBuilder)null)
            .Verifiable();

            var tagHelper = new SelectTagHelper
            {
                For         = modelExpression,
                Items       = inputItems,
                Generator   = htmlGenerator.Object,
                Multiple    = multiple,
                ViewContext = viewContext,
            };

            // Act
            await tagHelper.ProcessAsync(tagHelperContext, output);

            // Assert
            htmlGenerator.Verify();

            Assert.NotNull(viewContext.FormContext?.FormData);
            var keyValuePair = Assert.Single(
                viewContext.FormContext.FormData,
                entry => entry.Key == SelectTagHelper.SelectedValuesFormDataKey);

            Assert.Same(selectedValues, keyValuePair.Value);
        }
        private static ModelMetadata GetMetadata()
        {
            ModelMetadataProvider provider = new EmptyModelMetadataProvider();

            return(provider.GetMetadataForType(null, typeof(object)));
        }
예제 #21
0
     private static ModelValidationNode GetValidationNode()
     {
         var provider = new EmptyModelMetadataProvider();
         var metadata = provider.GetMetadataForType(null, typeof(object));
         return new ModelValidationNode(metadata, "someKey");
 }