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 に答える