我有一个想要能够动态设置元数据属性的ViewModel。例如,我希望能够使用其他模型属性的值自定义DisplayName和验证错误消息。我计划在Brad Wilson's article之后使用自定义MetadataProvider执行此操作。
我希望提供程序仅用于选定的ViewModel。所以我的问题是,我该如何配置?我已经看到了使用ModelMetadataProviders.Current = new MyModelMetadataProvider()
的示例,但这可能会使用自定义提供程序用于所有模型类实体。是否可以为单个ViewModel配置提供程序?
答案 0 :(得分:3)
你做不到。
但是,您可以充当所有其他模型的代理。类似的东西:
public class YourProvider<TViewModel>
{
public YourProvider(InnerProvider provider) {}
public ModelMetaData GetMetaData(SomeContext context)
{
if (context.ModelType != typeof(TViewModel))
return _innerProvider.GetMetaData(context);
//Other logic here.
}
}
最后将其指定为:
ModelMetadataProviders.Current
= new MyModelMetadataProvider<CustomViewModel>(ModelMetadataProviders.Current);
答案 1 :(得分:0)
我非常确定在您开始在网站上获得多个用户后,更改ViewModel中的当前模型元数据提供程序是不安全的,更不用说线程安全了。你可能可以使用属性方法,但你仍然需要实现自己的ModelMetadataProvider并在应用程序开始时将其设置为Current,然后检查某些属性并确定要返回的ModelMetaData,如果没有则返回通过基础实现。虽然说实话,你正在讨论的限制数量,让它只处理选定的视图模型但不允许知道或测试那些视图模型?听起来你在其他地方做错了......
更新:当我需要一个ModelMetadata提供程序时,我创建了一个看起来像这样的...
public class MyMetadataProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
if ((containerType != typeof(MyType))
return base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
//setup custom ModelMetadata here
}
}