예제 #1
0
        public void Map(IDynamicDataModelSchema details, Type modelType)
        {
            if (details == null)
            {
                throw new ArgumentNullException(nameof(details));
            }
            if (modelType == null)
            {
                throw new ArgumentNullException(nameof(modelType));
            }

            var dataModelMetaData = _modelMetadataProvider.GetMetadataForType(modelType);

            details.DataTemplateName = StringHelper.FirstNonEmpty(
                dataModelMetaData.TemplateHint,
                dataModelMetaData.DataTypeName
                );

            var properiesMetaData = _modelMetadataProvider.GetMetadataForProperties(modelType);

            var dataModelProperties = new List <DynamicDataModelSchemaProperty>();

            foreach (var propertyMetaData in properiesMetaData.OrderBy(p => p.Order))
            {
                var property = new DynamicDataModelSchemaProperty();
                property.Name        = propertyMetaData.PropertyName;
                property.DisplayName = propertyMetaData.DisplayName;
                property.Description = propertyMetaData.Description;
                property.IsRequired  = propertyMetaData.IsRequired;

                property.DataTemplateName = StringHelper.FirstNonEmpty(
                    propertyMetaData.TemplateHint,
                    propertyMetaData.DataTypeName,
                    propertyMetaData.IsNullableValueType ? propertyMetaData.ModelType.GenericTypeArguments[0].Name : propertyMetaData.ModelType.Name
                    );

                // Not sure why the keys here could be objects, but we're not interested in
                // them if they are.
                property.AdditionalAttributes = propertyMetaData
                                                .AdditionalValues
                                                .Where(d => d.Key is string)
                                                .ToDictionary(d => (string)d.Key, d => d.Value);

                dataModelProperties.Add(property);
            }

            details.DataModelProperties = dataModelProperties.ToArray();

            // A default constructor is required for data model seralization anyway
            // so that constraint isn't an issue here.
            details.DefaultValue       = new DynamicDataModelDefaultValue();
            details.DefaultValue.Value = Activator.CreateInstance(modelType);
        }
        private static void ApplyModelMetadata(this JqGridSubgridModel subgridModel, IModelMetadataProvider metadataProvider)
        {
            Type jqGridsubgridModelType = subgridModel.GetType();

            if (jqGridsubgridModelType.IsConstructedGenericType && jqGridsubgridModelType.GetGenericTypeDefinition() == typeof(JqGridSubgridModel <>))
            {
                foreach (ModelMetadata columnMetadata in metadataProvider.GetMetadataForProperties(jqGridsubgridModelType.GenericTypeArguments[0]))
                {
                    if (IsValidForColumn(columnMetadata))
                    {
                        subgridModel.AddColumn(CreateJqGridSubgridColumnModel(columnMetadata));
                    }
                }
            }
        }
        internal static void ApplyModelMetadata(this JqGridOptions options, IModelMetadataProvider metadataProvider)
        {
            Type jqGridOptionsType = options.GetType();

            if (jqGridOptionsType.IsConstructedGenericType && jqGridOptionsType.GetGenericTypeDefinition() == typeof(JqGridOptions <>))
            {
                foreach (ModelMetadata columnMetadata in metadataProvider.GetMetadataForProperties(jqGridOptionsType.GenericTypeArguments[0]))
                {
                    if (IsValidForColumn(columnMetadata))
                    {
                        options.AddColumn(columnMetadata.GetDisplayName(), CreateJqGridColumnModel(columnMetadata));
                    }
                }
            }
        }
            /// <inheritdoc/>
            public IEnumerable <ModelMetadata> GetMetadataForProperties(Type modelType)
            {
                if (actionExecutionModel != null &&
                    typeof(ActionExecutionModel).IsAssignableFrom(modelType) &&
                    originalModelMetadataProvider is not ActionExecutionModelMetadataProviderScope)
                {
                    var compositeMetadataDetailsProvider = controller.HttpContext.RequestServices.GetService <ICompositeMetadataDetailsProvider>();

                    var metadata = ActionExecutionModelMetadataFactory.GetMetadata(originalModelMetadataProvider, compositeMetadataDetailsProvider, actionExecutionModel);

                    return(metadata.GetMetadataForProperties(modelType));
                }
                else
                {
                    return(originalModelMetadataProvider.GetMetadataForProperties(modelType));
                }
            }
        internal static void ApplyModelMetadata(this JqGridOptions options, IModelMetadataProvider metadataProvider, IUrlHelper urlHelper)
        {
            IJqGridStronglyTypedOptions jqGridStronglyTypedOptions = options as IJqGridStronglyTypedOptions;

            if (jqGridStronglyTypedOptions != null)
            {
                foreach (ModelMetadata columnMetadata in metadataProvider.GetMetadataForProperties(jqGridStronglyTypedOptions.ModelType))
                {
                    if (IsValidForColumn(columnMetadata))
                    {
                        options.AddColumn(columnMetadata.GetDisplayName(), CreateJqGridColumnModel(columnMetadata, urlHelper));
                    }
                }

                if (jqGridStronglyTypedOptions.ActionsColumn != null)
                {
                    if (jqGridStronglyTypedOptions.ActionsColumn.Position >= options.ColumnsModels.Count)
                    {
                        options.AddColumn(_actionsColumnDisplayName, CreateActionsColumnModel(jqGridStronglyTypedOptions.ActionsColumn));
                    }
                    else
                    {
                        options.InsertColumn(jqGridStronglyTypedOptions.ActionsColumn.Position, _actionsColumnDisplayName, CreateActionsColumnModel(jqGridStronglyTypedOptions.ActionsColumn));
                    }
                }
            }

            if (options.SubgridEnabled)
            {
                if (options.SubgridOptions != null)
                {
                    options.SubgridOptions.ApplyModelMetadata(metadataProvider, urlHelper);
                }
                else if (options.SubgridModel != null)
                {
                    options.SubgridModel.ApplyModelMetadata(metadataProvider);
                }
            }
        }
예제 #6
0
        private void Initialize()
        {
            var assembly = Assembly.GetExecutingAssembly();
            var types    = assembly.GetTypes();

            var filteredTypes = types.Where(t => t.IsSubclassOf(typeof(T)));

            if (typeof(T).IsInterface)
            {
                filteredTypes = types.Where(t => !t.IsInterface &&
                                            t.GetInterfaces().Any(i => i == typeof(T)));
            }

            foreach (var type in filteredTypes)
            {
                if (type.GetCustomAttribute <ForPropertyTypeAttribute>() is var forTypeAttribute &&
                    forTypeAttribute != null)
                {
                    _filterTypeMap[(int)forTypeAttribute.Type] = type;
                }

                if (type.GetCustomAttribute <ForPropertyAttribute>() is var forIdAttribute &&
                    forIdAttribute != null)
                {
                    _filterIdMap[forIdAttribute.PropertyId] = type;
                }

                var ctor = type.GetConstructor(new Type[] { });
                if (ctor == null)
                {
                    throw new Exception($"Type '{type}' does not have parameterless constructor");
                }
                _factories[type] = (Func <object>)Expression.Lambda(Expression.New(ctor)).Compile();

                _filterMetadata[type]     = _metadataProvider.GetMetadataForType(type);
                _propertiesMetadata[type] = _metadataProvider.GetMetadataForProperties(type).ToList();
            }
        }
예제 #7
0
 /// <inheritdoc />
 public override IEnumerable <ModelMetadata> GetMetadataForProperties(Type modelType)
 {
     return(_provider.GetMetadataForProperties(modelType));
 }
        /// <summary>
        /// Get the localized DisplayName for the property of a model with <see cref="System.ComponentModel.DataAnnotations"/>.
        /// </summary>
        /// <typeparam name="T">The type of the class.</typeparam>
        /// <param name="propertyName">The field name to get the localized DisplayName.</param>
        /// <returns>Returns the localized DisplayName, or NULL if the name was not found</returns>
        public string GetDisplayName <T>(string propertyName)
        {
            var mdp = _metadataProvider.GetMetadataForProperties(typeof(T));

            return(mdp.FirstOrDefault(d => d.Name == propertyName)?.DisplayName); // localized if resource file is present
        }