public MetadataOverrideScope(ModelMetadata metadata)
        {
            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }
            if (metadata.ModelType == null)
            {
                throw new ArgumentException("Need ModelType", "metadata");
            }

            _oldMetadataProvider = ModelMetadataProviders.Current;
            _metadata            = metadata;
            _modelType           = metadata.ModelType;

            // Mock a ModelMetadataProvider which delegates to the old one in most cases.  No need to special-case
            // GetMetadataForProperties() because product code uses it only within ModelMetadata.Properties and our
            // metadata instance will call _oldMetadataProvider there.
            var metadataProvider = new Mock <ModelMetadataProvider>();

            metadataProvider
            .Setup(p => p.GetMetadataForProperties(It.IsAny <object>(), It.IsAny <Type>()))
            .Returns((object container, Type containerType) =>
                     _oldMetadataProvider.GetMetadataForProperties(container, containerType));
            metadataProvider
            .Setup(p => p.GetMetadataForType(It.IsAny <Func <object> >(), It.IsAny <Type>()))
            .Returns((Func <object> modelAccessor, Type modelType) =>
                     _oldMetadataProvider.GetMetadataForType(modelAccessor, modelType));

            // When metadata for _modelType is requested, then return a clone of the provided metadata instance.
            // GetMetadataForProperty() is important because the static discovery methods (e.g.
            // ModelMetadata.FromLambdaExpression) use it.
            metadataProvider
            .Setup(p => p.GetMetadataForType(It.IsAny <Func <object> >(), _modelType))
            .Returns((Func <object> modelAccessor, Type modelType) => GetMetadataForType(modelAccessor, modelType));
            metadataProvider
            .Setup(p =>
                   p.GetMetadataForProperty(It.IsAny <Func <object> >(), It.IsAny <Type>(), It.IsAny <string>()))
            .Returns((Func <object> modelAccessor, Type containerType, string propertyName) =>
                     GetMetadataForProperty(modelAccessor, containerType, propertyName));

            // Calls to GetMetadataForProperties for the modelType are incorrect because _metadata.Provider must
            // reference _oldMetadataProvider and not this mock.
            metadataProvider
            .Setup(p => p.GetMetadataForProperty(It.IsAny <Func <object> >(), _modelType, It.IsAny <string>()))
            .Throws <InvalidOperationException>();

            // Finally make our ModelMetadataProvider visible everywhere.
            ModelMetadataProviders.Current = metadataProvider.Object;
        }
        public MetadataOverrideScope(ModelMetadata metadata)
        {
            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }
            if (metadata.ModelType == null)
            {
                throw new ArgumentException("Need ModelType", "metadata");
            }

            _oldMetadataProvider = ModelMetadataProviders.Current;
            _metadata = metadata;
            _modelType = metadata.ModelType;

            // Mock a ModelMetadataProvider which delegates to the old one in most cases.  No need to special-case
            // GetMetadataForProperties() because product code uses it only within ModelMetadata.Properties and our
            // metadata instance will call _oldMetadataProvider there.
            var metadataProvider = new Mock<ModelMetadataProvider>();
            metadataProvider
                .Setup(p => p.GetMetadataForProperties(It.IsAny<object>(), It.IsAny<Type>()))
                .Returns((object container, Type containerType) =>
                    _oldMetadataProvider.GetMetadataForProperties(container, containerType));
            metadataProvider
                .Setup(p => p.GetMetadataForType(It.IsAny<Func<object>>(), It.IsAny<Type>()))
                .Returns((Func<object> modelAccessor, Type modelType) =>
                    _oldMetadataProvider.GetMetadataForType(modelAccessor, modelType));

            // When metadata for _modelType is requested, then return a clone of the provided metadata instance.
            // GetMetadataForProperty() is important because the static discovery methods (e.g.
            // ModelMetadata.FromLambdaExpression) use it.
            metadataProvider
                .Setup(p => p.GetMetadataForType(It.IsAny<Func<object>>(), _modelType))
                .Returns((Func<object> modelAccessor, Type modelType) => GetMetadataForType(modelAccessor, modelType));
            metadataProvider
                .Setup(p =>
                    p.GetMetadataForProperty(It.IsAny<Func<object>>(), It.IsAny<Type>(), It.IsAny<string>()))
                .Returns((Func<object> modelAccessor, Type containerType, string propertyName) =>
                    GetMetadataForProperty(modelAccessor, containerType, propertyName));

            // Calls to GetMetadataForProperties for the modelType are incorrect because _metadata.Provider must
            // reference _oldMetadataProvider and not this mock.
            metadataProvider
                .Setup(p => p.GetMetadataForProperty(It.IsAny<Func<object>>(), _modelType, It.IsAny<string>()))
                .Throws<InvalidOperationException>();

            // Finally make our ModelMetadataProvider visible everywhere.
            ModelMetadataProviders.Current = metadataProvider.Object;
        }
Example #3
0
        public void Map(IDynamicDataModelSchema details, Type modelType)
        {
            Condition.Requires(details).IsNotNull();
            Condition.Requires(modelType).IsNotNull();

            var dataModelMetaData = _modelMetadataProvider.GetMetadataForType(null, modelType);

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

            var properiesMetaData = _modelMetadataProvider.GetMetadataForProperties(null, 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
                    );

                property.AdditionalAttributes = propertyMetaData.AdditionalValues;

                dataModelProperties.Add(property);
            }

            details.DataModelProperties = dataModelProperties.ToArray();
        }
Example #4
0
 public override IEnumerable <ModelMetadata> GetMetadataForProperties(object container, Type containerType)
 {
     return(_innerProvider.GetMetadataForProperties(container, containerType));
 }
Example #5
0
 public override IEnumerable <ModelMetadata> GetMetadataForProperties(object container, Type containerType)
 {
     return(_innerMetadataProvider.GetMetadataForProperties(container, containerType)
            .Where(metadata => _propertyFilter(metadata.PropertyName)));
 }