/// <summary>
        /// Gets a <see cref="T:System.Web.Mvc.ModelMetadata"/> object for each property of a model.
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="containerType">The type of the container.</param>
        /// <returns>
        /// A <see cref="T:System.Web.Mvc.ModelMetadata"/> object for each property of a model.
        /// </returns>
        public override IEnumerable <ModelMetadata> GetMetadataForProperties([NotNull] object container, [NotNull] Type containerType)
        {
            Invariant.IsNotNull(containerType, "containerType");

            var metadataItems = registry.GetModelPropertiesMetadata(containerType);

            if (metadataItems == null || metadataItems.Count == 0)
            {
                return(base.GetMetadataForProperties(container, containerType));
            }

            IList <ModelMetadata> list = new List <ModelMetadata>();

            foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(containerType))
            {
                ModelMetadataItem metadata;
                metadataItems.TryGetValue(descriptor.Name, out metadata);

                var tempDescriptor = descriptor;

                var modelMetadata = CreatePropertyMetadata(
                    containerType,
                    tempDescriptor.Name,
                    tempDescriptor.PropertyType,
                    metadata,
                    () => tempDescriptor.GetValue(container));

                list.Add(modelMetadata);
            }

            return(list);
        }
        public static IDictionary<string, ModelMetadataItem> RegisterExtendedModelMetadata(
            Type modelType,
            ExtendedModelMetadataProvider metadataProvider,
            IModelMetadataRegistry extMetadataRegistry)
        {
            var modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(
                () => Activator.CreateInstance(modelType),
                modelType);

            var extModelMetadataItem = CreateModelMetadataItem(modelMetadata, modelType.GetCustomAttributes());
            var extModelMetadataProperties = new Dictionary<string, ModelMetadataItem>();
            var modelTypeProperties = modelType.GetProperties();
            foreach (var property in modelMetadata.Properties)
            {
                var modelProperty = modelTypeProperties.Single(p => p.Name == property.PropertyName);
                extModelMetadataProperties.Add(property.PropertyName, CreateModelMetadataItem(property, modelProperty.GetCustomAttributes()));
            }

            extMetadataRegistry.RegisterModel(modelType, extModelMetadataItem);
            extMetadataRegistry.RegisterModelProperties(modelType, extModelMetadataProperties);

            return extMetadataRegistry.GetModelPropertiesMetadata(modelType);
        }
Esempio n. 3
0
        private static void SetupModelExtendedValidators(
            Type modelType,
            IModelMetadataRegistry extMetadataRegistry)
        {
            Throw.IfNullArgument(modelType, "model");

            var extendedMetadata = extMetadataRegistry.GetModelPropertiesMetadata(modelType);
            if (extendedMetadata == null)
            {
                _log.DebugFormat("Init fluent configuration for {0}", modelType.Name);
                var metadataProvider = ModelMetadataProviders.Current as ExtendedModelMetadataProvider;

                _convertedModelsCount++;
                extendedMetadata = FluentMetadataHelper.RegisterExtendedModelMetadata(modelType, metadataProvider, extMetadataRegistry);
            }

            _log.DebugFormat("Localize model {0}", modelType.Name);
            var localizer = new ValidationLocalizer(modelType, extendedMetadata);
            localizer.ProcessModel();
        }