改變視圖模型的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?
------------------------編輯-------------------- ------
我發現我們可以設置/改變的元數據爲一個類型通過像這樣繼承DataAnnotationsModelMetadataProvider和DataAnnotationsModelValidatorProvider類和重寫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或其他?)
ow!這個簡單的任務太複雜了!我更喜歡爲它找到解決方法! – 2011-12-25 18:30:26
@MahmoudMoravej,這就是爲什麼我不使用DataAnnotations在我的應用程序中執行驗證的原因。我使用FluentValidation.NET。 – 2011-12-25 18:32:49