为ViewModel配置Custom MetadataProvider

时间:2013-02-04 16:49:58

标签: asp.net-mvc entity-framework-4 modelmetadataprovider

我有一个想要能够动态设置元数据属性的ViewModel。例如,我希望能够使用其他模型属性的值自定义DisplayName和验证错误消息。我计划在Brad Wilson's article之后使用自定义MetadataProvider执行此操作。

我希望提供程序仅用于选定的ViewModel。所以我的问题是,我该如何配置?我已经看到了使用ModelMetadataProviders.Current = new MyModelMetadataProvider()的示例,但这可能会使用自定义提供程序用于所有模型类实体。是否可以为单个ViewModel配置提供程序?

2 个答案:

答案 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
    }
}