1

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

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

4

2 回答 2

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);
于 2013-02-05T09:49:25.660 回答
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
    }
}
于 2013-02-05T16:17:24.457 回答