我正在使用RIA Services與LinqToEntitiesDomainService <>和Silverlight 5 Beta在客戶端生成DomainContext代碼。我的模型/實體中有數據註釋來進行基本驗證,並且直接使用模型時,DataForm等控件可以立即執行驗證。但是我將模型封裝在ViewModel中,所以我失去了所有的自動驗證。下面是一個簡單的例子:如何在ViewModel上使用Data Annotations?
// In DataModel assembly, regenerated on the client side by RIA Services
public class PetModel
{
[Required]
public string Name { get; set; }
}
// Only on the client side
public class PetViewmodel
{
private PetModel _model;
public PetViewmodel(PetModel model)
{
_model = model;
}
public string Name
{
get { return _model.Name; }
set { _model.Name = value; }
}
}
我的問題是:我怎麼能保證Name
被認爲是在客戶端Required
沒有複製所有我的視圖模型註解? (我可以在未來使用這些實體與不同的ViewModels - 我想保持相同的註解)
我想到了手動添加MetadataType
屬性視圖模型,指着型號類型:
[MetadataType(typeof(PetModel))]
public class PetViewmodel
{
...
}
但是,唉,MetadataTypeAttribute
不適用於System.ComponentModel.DataAnnotations
的Silverlight 5版本。
編輯:澄清 - 我的實體的元數據包含在具有嵌套類的實體中。我手動編寫這個類,因爲我的L2E模型在一個單獨的程序集中,所以DomainService嚮導不會爲我生成它。
[MetadataType(typeof(Metadata))]
public partial class PetModel
{
[Required]
public string Name { get; set; }
public class Metadata
{
[Required]
public string Name { get; set; }
}
}
這應該是如果我正確理解嚮導將生成元數據。 RIA Services代碼生成器在客戶端代碼中生成正確的數據註釋,所以它正確地選取它。
您的域名服務沒有生成.meta.cs文件嗎? – 2011-05-25 21:35:54
@ subt13:感謝您的迴應。我添加了一個說明來解答你的問題。你給了我一個想法:我想如果我分離出我的MetaData類並在客戶端和服務器之間共享它們,我應該能夠通過使用部分類而不是MetadataTypeAttribute將它們包含在客戶端中。我們將會看到... – HiredMind 2011-05-25 23:22:36
非常感謝,我的設置與您的設置相同,但我嘗試從DomainService繼承。 – 2011-05-25 23:24:27