您可以尝试ModelMetadata.TemplateHint
在ModelMetadataProvider
. 一种方法是使用装饰器模式:
public class AbstractTypeTemplateSupportingModelMetadataProvider : ModelMetadataProvider
{
private readonly ModelMetadataProvider wrapped;
public AbstractTypeTemplateSupportingModelMetadataProvider(ModelMetadataProvider wrapped)
{
this.wrapped = wrapped;
}
public override IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType)
{
var result = this.wrapped.GetMetadataForProperties(container, containerType).ToList();
result.ForEach(ChangeTemplateHint);
return result;
}
public override ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, string propertyName)
{
var result = this.wrapped.GetMetadataForProperty(modelAccessor, containerType, propertyName);
ChangeTemplateHint(result);
return result;
}
public override ModelMetadata GetMetadataForType(Func<object> modelAccessor, Type modelType)
{
var result = this.wrapped.GetMetadataForType(modelAccessor, modelType);
ChangeTemplateHint(result);
return result;
}
private void ChangeTemplateHint(ModelMetadata source)
{
if (source.Model is IAppProvider) //Or use source.ModelType if you want to support the model being null.
source.TemplateHint = typeof(IAppProvider).Name;
}
}
在您的启动逻辑中:
ModelMetadataProviders.Current = new AbstractTypeTemplateSupportingModelMetadataProvider(ModelMetadataProviders.Current);