2011-12-25 65 views
4

改變視圖模型的MetadataType屬性在Microsoft MVC 3.0,我有一個類:在運行時

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

這個類可以表現爲產品或服務,它們之間唯一的區別只是在查看時間字段標籤。

所以我創建兩個類:

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

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

我如何設置這些類在運行時爲MetadataType

------------------------編輯-------------------- ------

我發現我們可以設置/改變的元數據爲一個類型通過像這樣繼承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()); 

但問題是如何能夠依賴它模型實例並不僅僅是類型?!......當我看到沒有任何通過這些類型號訪問。 MVC pipleline中有沒有什麼地方可以根據模型數據更改這兩個提供者類別? (例如:OnActionExecuting或其他?)

回答

5

你可以寫一個custom model metadata provider。例如,你可以看看MvcExtensions。他們實現了such provider以便能夠在運行時動態地將元數據關聯到給定類型。 FluentValidation.NET使用相同的技術。

+1

ow!這個簡單的任務太複雜了!我更喜歡爲它找到解決方法! – 2011-12-25 18:30:26

+2

@MahmoudMoravej,這就是爲什麼我不使用DataAnnotations在我的應用程序中執行驗證的原因。我使用FluentValidation.NET。 – 2011-12-25 18:32:49