예제 #1
0
        public static ModelMetadata ForType(Type modelType)
        {
            var mockModelMetadataProvider            = new Mock <IModelMetadataProvider>();
            var mockCompositeMetadataDetailsProvider = new Mock <ICompositeMetadataDetailsProvider>();
            var defaultMetadataDetails = new DefaultMetadataDetails(ModelMetadataIdentity.ForType(modelType), ModelAttributes.GetAttributesForType(typeof(List <object>)));

            return(new DefaultModelMetadata(mockModelMetadataProvider.Object, mockCompositeMetadataDetailsProvider.Object, defaultMetadataDetails));
        }
예제 #2
0
    public static DefaultModelMetadata CreateModelMetadata <T>()
    {
        var metadataDetailProvider = new Mock <ICompositeMetadataDetailsProvider>().Object;
        var modelMetadataProvider  = new DefaultModelMetadataProvider(metadataDetailProvider);
        var details = new DefaultMetadataDetails(ModelMetadataIdentity.ForType(typeof(T)), ModelAttributes.GetAttributesForType(typeof(T)));

        return(new DefaultModelMetadata(modelMetadataProvider, metadataDetailProvider, details));
    }
예제 #3
0
        protected override ModelMetadata CreateModelMetadata(DefaultMetadataDetails entry)
        {
            if (typeof(Lite <Entity>).IsAssignableFrom(entry.Key.ModelType) ||
                typeof(IModifiableEntity).IsAssignableFrom(entry.Key.ModelType))
            {
                return(new SignumModelMetadata(this, this.DetailsProvider, entry));
            }

            return(base.CreateModelMetadata(entry));
        }
        /// <inheritdoc />
        protected override ModelMetadata CreateModelMetadata(DefaultMetadataDetails entry)
        {
            var metadata = (DefaultModelMetadata)base.CreateModelMetadata(entry);

            if (metadata.ValidationMetadata.IsRequired == true)
            {
                metadata.ValidationMetadata.PropertyValidationFilter = _jsonApiValidationFilter;
            }

            return(metadata);
        }
        public void CreateModelMetadata_NullContainerType_DoesNotSetDisplayName()
        {
            DefaultMetadataDetails metaDetails = new DefaultMetadataDetails(
                new ModelMetadataIdentity(), ModelAttributes.GetAttributesForType(typeof(RoleView)));
            ICompositeMetadataDetailsProvider details  = Substitute.For <ICompositeMetadataDetailsProvider>();
            DisplayNameMetadataProviderProxy  provider = new DisplayNameMetadataProviderProxy(details);

            String actual = provider.BaseCreateModelMetadata(metaDetails).DisplayName;

            Assert.Null(actual);
        }
예제 #6
0
        private static DefaultMetadataDetails CreateMetadataDetails(ParameterSpecification parameterSpecification, ActionExecutionModel containerModel)
        {
            if (parameterSpecification == null)
            {
                throw new ArgumentNullException(nameof(parameterSpecification));
            }
            if (containerModel == null)
            {
                throw new ArgumentNullException(nameof(containerModel));
            }

#pragma warning disable CS0618 // Type or member is obsolete
            var parameterMetadataIdentity = ModelMetadataIdentity.ForProperty(parameterSpecification.Type, parameterSpecification.Key, containerModel.GetType());
#pragma warning restore CS0618 // Type or member is obsolete

            var parameterAttributes = ModelAttributes.GetAttributesForProperty(containerModel.GetType(), nullPropertyInfo, parameterSpecification.Type);

            var propertyMetadataDetails = new DefaultMetadataDetails(
                parameterMetadataIdentity,
                parameterAttributes)
            {
                PropertyGetter     = thisModel => GetParameterValue((ActionExecutionModel)thisModel, parameterSpecification),
                PropertySetter     = (thisModel, value) => SetParameterValue((ActionExecutionModel)thisModel, parameterSpecification, value),
                ValidationMetadata = new ValidationMetadata
                {
                    IsRequired = parameterSpecification.IsRequired
                },
                DisplayMetadata = new DisplayMetadata()
            };

            var dataTypeAttribute = parameterSpecification.ValidationAttributes.OfType <DataTypeAttribute>().FirstOrDefault();

            if (dataTypeAttribute != null)
            {
                propertyMetadataDetails.DisplayMetadata.DataTypeName = dataTypeAttribute.GetDataTypeName();
            }

            foreach (var attribute in parameterSpecification.ValidationAttributes)
            {
                propertyMetadataDetails.ValidationMetadata.ValidatorMetadata.Add(attribute);
            }

            foreach (var attribute in parameterSpecification.Type.GetCustomAttributes <ValidationAttribute>(true))
            {
                propertyMetadataDetails.ValidationMetadata.ValidatorMetadata.Add(attribute);
            }

            if (propertyMetadataDetails.ValidationMetadata.ValidatorMetadata.Count > 0 || typeof(IValidatableObject).IsAssignableFrom(parameterSpecification.Type))
            {
                propertyMetadataDetails.ValidationMetadata.HasValidators = true;
            }

            return(propertyMetadataDetails);
        }
예제 #7
0
        private ModelMetadata GetRequiredMetadata()
        {
            var details = new DefaultMetadataDetails(ModelMetadataIdentity.ForType(typeof(string)),
                                                     ModelAttributes.GetAttributesForType(typeof(string)))
            {
                ValidationMetadata = new ValidationMetadata {
                    IsRequired = true
                }
            };

            return(new DefaultModelMetadata(new EmptyModelMetadataProvider(), new DefaultCompositeMetadataDetailsProvider(new IMetadataDetailsProvider[0]), details));
        }
        public void CreateModelMetadata_SetsDisplayName()
        {
            DefaultMetadataDetails metaDetails = new DefaultMetadataDetails(
                ModelMetadataIdentity.ForProperty(typeof(String), "Title", typeof(RoleView)), ModelAttributes.GetAttributesForType(typeof(RoleView)));
            ICompositeMetadataDetailsProvider details  = Substitute.For <ICompositeMetadataDetailsProvider>();
            DisplayNameMetadataProviderProxy  provider = new DisplayNameMetadataProviderProxy(details);

            String expected = ResourceProvider.GetPropertyTitle(typeof(RoleView), "Title");
            String actual   = provider.BaseCreateModelMetadata(metaDetails).DisplayName;

            Assert.Equal(expected, actual);
        }
        private void RecreateMetadata(ModelMetadataIdentity key, DefaultMetadataDetails details)
        {
            var validationContext = new ValidationMetadataProviderContext(key, details.ModelAttributes);
            var displayContext    = new DisplayMetadataProviderContext(key, details.ModelAttributes);
            var bindingContext    = new BindingMetadataProviderContext(key, details.ModelAttributes);

            DetailsProvider.CreateValidationMetadata(validationContext);
            DetailsProvider.CreateDisplayMetadata(displayContext);
            DetailsProvider.CreateBindingMetadata(bindingContext);
            details.ValidationMetadata = validationContext.ValidationMetadata;
            details.DisplayMetadata    = displayContext.DisplayMetadata;
            details.BindingMetadata    = bindingContext.BindingMetadata;
        }
        public override ModelMetadata GetMetadataForType(Type modelType)
        {
            if (modelType != typeof(TestModel))
            {
                return(base.GetMetadataForType(modelType));
            }

            var key = ModelMetadataIdentity.ForType(modelType);
            DefaultMetadataDetails details = CreateTypeDetails(key);

            RecreateMetadata(key, details);

            return(CreateModelMetadata(details));
        }
예제 #11
0
        private void ExpandParam(IList <ApiParameterDescription> apds, string name, ApiParameterDescription apdParent, Type modelType)
        {
            var pis = modelType.GetProperties();

            foreach (var pi in pis)
            {
                var itemType   = GetEnumerableElementType(pi.PropertyType, out bool isEnumerable);
                var isCombType = IsComboType(pi.PropertyType);
                if (isEnumerable && !IsBaseType(itemType))
                {
                    ExpandParam(apds, $"{name}.{pi.Name}[0]", apdParent, itemType);
                }
                else if (isCombType)
                {
                    ExpandParam(apds, $"{name}.{pi.Name}", apdParent, pi.PropertyType);
                }
                else
                {
                    //var dmd = new DefaultMetadataDetails(
                    //    ModelMetadataIdentity.ForProperty(pi.PropertyType, pi.Name, modelType),
                    //    new ModelAttributes(new object[0]))
                    //{
                    //    ValidationMetadata = new ValidationMetadata()
                    //    {
                    //        IsRequired = false
                    //    }
                    //};
                    var dmd = new DefaultMetadataDetails(
                        ModelMetadataIdentity.ForProperty(pi.PropertyType, pi.Name, modelType),
                        null)
                    {
                        ValidationMetadata = new ValidationMetadata()
                        {
                            IsRequired = false
                        }
                    };
                    var md = new DefaultModelMetadata(_mmp, _cmdp, dmd);

                    var apd = new ApiParameterDescription
                    {
                        Type          = pi.PropertyType,
                        ModelMetadata = md,
                        Name          = $"{name}.{pi.Name}",
                        RouteInfo     = apdParent.RouteInfo,
                        Source        = apdParent.Source
                    };
                    apds.Add(apd);
                }
            }
        }
예제 #12
0
        protected virtual EntityMetadataDetails ConvertMetadataDetails(DefaultMetadataDetails details)
        {
            var entityDetails = new EntityMetadataDetails(details.Key, details.ModelAttributes);

            entityDetails.BindingMetadata    = details.BindingMetadata;
            entityDetails.ContainerMetadata  = details.ContainerMetadata;
            entityDetails.DisplayMetadata    = details.DisplayMetadata;
            entityDetails.PropertyGetter     = details.PropertyGetter;
            entityDetails.PropertySetter     = details.PropertySetter;
            entityDetails.Properties         = entityDetails.Properties;
            entityDetails.ValidationMetadata = details.ValidationMetadata;

            return(entityDetails);
        }
예제 #13
0
        private static DefaultMetadataDetails CreateMetadataDetails(ActionExecutionModel model)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            var modelMetadataIdentity = ModelMetadataIdentity.ForType(model.GetType());

            var modelAttributes = ModelAttributes.GetAttributesForType(model.GetType());

            var modelMetadataDetails = new DefaultMetadataDetails(modelMetadataIdentity, modelAttributes);

            return(modelMetadataDetails);
        }
예제 #14
0
        public static IEnumerable <KeyValuePair <Type, ModelMetadata> > CreateMetadataForTypes(params Type[] types)
        {
            var provider        = new EmptyModelMetadataProvider();
            var detailsProvider = new DefaultCompositeMetadataDetailsProvider(
                Enumerable.Empty <IMetadataDetailsProvider>());

            foreach (var type in types)
            {
                var key      = ModelMetadataIdentity.ForType(type);
                var cache    = new DefaultMetadataDetails(key, ModelAttributes.GetAttributesForType(type));
                var metadata = new DefaultModelMetadata(provider, detailsProvider, cache);
                Xunit.Assert.Equal(type, metadata.ModelType);
                Xunit.Assert.Null(metadata.PropertyName);
                Xunit.Assert.Null(metadata.ContainerType);
                yield return(KeyValuePair.Create <Type, ModelMetadata>(type, metadata));
            }
        }
        public void GetBinderReturnsNullForUnsupportedTypeTest()
        {
            var context         = Substitute.For <ModelBinderProviderContext>();
            var provider        = Substitute.For <IModelMetadataProvider>();
            var detailsProvider = Substitute.For <ICompositeMetadataDetailsProvider>();
            var key             = ModelMetadataIdentity.ForType(typeof(string));
            IEnumerable <object> typeAttributes = new List <object>();
            var attributes = new ModelAttributes(typeAttributes);
            var details    = new DefaultMetadataDetails(key, attributes);
            var metadata   = new DefaultModelMetadata(provider, detailsProvider, details);

            context.Metadata.Returns(metadata);

            var sut = new ProfileFilterModelBinderProvider();

            var actual = sut.GetBinder(context);

            actual.Should().BeNull();
        }
예제 #16
0
        public void GetFormattedWeek_ReturnsExpectedFormattedValue(int year, int month, int day, string expectedOutput)
        {
            // Arrange
            var detailsProvider = new DefaultCompositeMetadataDetailsProvider(
                Enumerable.Empty <IMetadataDetailsProvider>());
            var key   = ModelMetadataIdentity.ForType(typeof(DateTime));
            var cache = new DefaultMetadataDetails(key, new ModelAttributes(new object[0], null, null));

            var provider      = new EmptyModelMetadataProvider();
            var metadata      = new DefaultModelMetadata(provider, detailsProvider, cache);
            var model         = new DateTime(year, month, day);
            var modelExplorer = new ModelExplorer(provider, metadata, model);

            // Act
            var formattedValue = FormatWeekHelper.GetFormattedWeek(modelExplorer);

            // Assert
            Assert.Equal(expectedOutput, formattedValue);
        }
예제 #17
0
        private DefaultMetadataDetails CreateSinglePropertyDetails(ModelMetadataIdentity propertyKey, PropertyInfo property)
        {
            var containerType = propertyKey.ContainerType;

            var attributes = ModelAttributes.GetAttributesForProperty(containerType, property, propertyKey.ModelType);

            var propertyEntry = new DefaultMetadataDetails(propertyKey, attributes);

            if (property.CanRead && property.GetMethod?.IsPublic == true)
            {
                propertyEntry.PropertyGetter = property.MakeFastGetter <object, object>();
            }

            if (property.CanWrite && property.SetMethod?.IsPublic == true && !containerType.IsValueType)
            {
                propertyEntry.PropertySetter = property.MakeFastSetter <object, object>();
            }

            return(propertyEntry);
        }
예제 #18
0
 public CustomModelMetadata(ICustomModelMetadataProviderSingleton provider, ICompositeMetadataDetailsProvider detailsProvider, DefaultMetadataDetails details, DefaultModelBindingMessageProvider modelBindingMessageProvider)
     : base(provider, detailsProvider, details, modelBindingMessageProvider)
 {
     _customProvider = provider;
 }
예제 #19
0
 public ModelMetadata BaseCreateModelMetadata(DefaultMetadataDetails entry)
 {
     return(CreateModelMetadata(entry));
 }
예제 #20
0
 public CustomModelMetadata(ICustomModelMetadataProviderSingleton provider, ICompositeMetadataDetailsProvider detailsProvider, DefaultMetadataDetails details)
     : base(provider, detailsProvider, details)
 {
     _customProvider = provider;
 }
 protected override ModelMetadata CreateModelMetadata(DefaultMetadataDetails entry)
 {
     return(new CustomModelMetadata(this, DetailsProvider, entry, ModelBindingMessageProvider));
 }
 protected override ModelMetadata CreateModelMetadata(DefaultMetadataDetails entry)
 {
     return(new LocalizedModelMetadata(this, DetailsProvider, entry));
 }
예제 #23
0
 public ModelMetadataCacheEntry(ModelMetadata metadata, DefaultMetadataDetails details)
 {
     Metadata = metadata;
     Details  = details;
 }
예제 #24
0
 public SignumModelMetadata(IModelMetadataProvider provider, ICompositeMetadataDetailsProvider detailsProvider, DefaultMetadataDetails details) :
     base(provider, detailsProvider, details)
 {
 }
 public LocalizedModelMetadata(IModelMetadataProvider provider, ICompositeMetadataDetailsProvider detailsProvider, DefaultMetadataDetails details)
     : base(provider, detailsProvider, details)
 {
     if (ContainerType == null)
     {
         LocalizedDisplayName = base.DisplayName;
     }
     else
     {
         LocalizedDisplayName = ResourceProvider.GetPropertyTitle(ContainerType, PropertyName);
     }
 }