2011-12-25 6 views
4

でのviewmodelのたmetadataType属性を変更し、私はクラスを持っている:このクラスは、製品として、あるいはサービスとして表すことができるは、マイクロソフトMVC 3.0で実行

public class Product{ 
    public string Title {get;set;} 
} 

、それらの間の唯一の違いは、閲覧時にだけ、フィールドのラベルです。

ので、私は、2つのクラスを作成:

public class ProductMetaData 
    { 
     [Display(Name = "Product")] 
     public object Title { get; set; } 
    } 

私は たmetadataTypeとして、実行時にこれらのクラスを設定するにはどうすればよい
public class ServiceMetaData 
    { 
     [Display(Name = "Service")] 
     public object Title { get; set; } 
    } 

を?

------------------------ EDIT -------------------- ------

私たちはクラスDataAnnotationsModelMetadataProviderDataAnnotationsModelValidatorProviderを継承し、このような両方でGetTypeDescriptor方法オーバーライドを通じてタイプ用/変更メタデータを設定することができますが見つかりました:

public class xx : DataAnnotationsModelMetadataProvider 
{ 

    protected override ICustomTypeDescriptor GetTypeDescriptor(Type type) 
    { 

     if (type == typeof(InvoiceItemViewModel)) 
      return (new AssociatedMetadataTypeTypeDescriptionProvider(typeof(InvoiceItemViewModel), typeof(InvoiceItemMetaData))).GetTypeDescriptor(type); 
     else 
      return base.GetTypeDescriptor(type); 
    } 
} 

public class yy : DataAnnotationsModelValidatorProvider 
{ 

    protected override ICustomTypeDescriptor GetTypeDescriptor(Type type) 
    { 

     if (type == typeof(InvoiceItemViewModel)) 
      return (new AssociatedMetadataTypeTypeDescriptionProvider(typeof(InvoiceItemViewModel), typeof(InvoiceItemMetaData))).GetTypeDescriptor(type); 
     else 
      return base.GetTypeDescriptor(type); 
    } 

} 

をそして、Gloの以下の変更点bal.ascx

ModelMetadataProviders.Current = new xx(); 

ModelValidatorProviders.Providers.Clear(); 
ModelValidatorProviders.Providers.Add(new yy()); 

しかし、問題は、モデルインスタンスにそれを依存し、ちょうど入力しない?!...私は、これらのクラスを通じてモデルへのすべてのアクセスがありません見ての通りことができる方法です。モデルデータに基づいてこれらの2つのプロバイダクラスを変更するためのMVCピンプラインの場所はありますか? (例:OnActionExecutingなど)

答えて

5

custom model metadata providerと書くことができます。たとえば、MvcExtensionsをご覧ください。彼らはsuch providerを実装して、実行時にメタデータを特定の型に動的に関連付けることができます。同じテクニックがFluentValidation.NETによって使用されています。

+1

OW!この単純な作業にはあまりにも複雑です!私はそれのための回避策を見つけることを好む! –

+2

@MahmoudMoravej、それが私のアプリケーションでDataAnnotationsを使用して検証を実行しない理由です。私はFluentValidation.NETを使用します。 –