2011-05-25 69 views
4

我正在使用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代碼生成器在客戶端代碼中生成正確的數據註釋,所以它正確地選取它。

+0

您的域名服務沒有生成.meta.cs文件嗎? – 2011-05-25 21:35:54

+0

@ subt13:感謝您的迴應。我添加了一個說明來解答你的問題。你給了我一個想法:我想如果我分離出我的MetaData類並在客戶端和服務器之間共享它們,我應該能夠通過使用部分類而不是MetadataTypeAttribute將它們包含在客戶端中。我們將會看到... – HiredMind 2011-05-25 23:22:36

+0

非常感謝,我的設置與您的設置相同,但我嘗試從DomainService繼承。 – 2011-05-25 23:24:27

回答

1

我找到了一種方法來做到這一點。希望它能幫助未來的人:

我使用了執行驗證的viewmodel的基類。在該基類上,我執行INotifyDataErrorInfo,並且我重寫NotifyOfPropertyChange方法(這是Caliburn.Micro的一部分,但如果您不使用,則可以輕鬆附加到該模型的PropertyChanged事件)。在事件處理程序中,我對該屬性執行驗證。在驗證代碼中,我使用反射來查找相同名稱的屬性以及屬性上的任何驗證屬性(RequiredAttribute,RangeAttribute等)。然後,我使用這些屬性中的值驗證已更改屬性上的新值,創建ValidationResult對象並將它們添加到List<ValidationResult>。如果所有'本地'驗證通過,那麼我繼續執行'遠程'驗證(即需要與服務器交互的驗證,例如檢查唯一性)。

這是很多工作,但不幸的是,這個 - 或類似的 - 是必要的。所有MS示例似乎都不使用MVVM。我認爲這只是爲了讓他們簡短/簡單,但MS的Silverlight團隊在設計對象模型時似乎沒有認真考慮MVVM。

相關問題