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; }
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(); }
public override IEnumerable <ModelMetadata> GetMetadataForProperties(object container, Type containerType) { return(_innerProvider.GetMetadataForProperties(container, containerType)); }
public override IEnumerable <ModelMetadata> GetMetadataForProperties(object container, Type containerType) { return(_innerMetadataProvider.GetMetadataForProperties(container, containerType) .Where(metadata => _propertyFilter(metadata.PropertyName))); }