2013-05-14 120 views
0

我有MVC項目,它依賴於webservices來提供數據,這些webservices基於CMIS規範和自定義功能。我有幾個用作DataContracts的類,當我添加對我打電話的服務的引用時,這些類是由Visual Studio創建的。我將該類用作模型,以確保能夠將實例發送到服務並正確處理發回給我的那些實例。使用DataAnnotations驗證繼承的屬性

我也有編輯這些類的實例的意見,我想使用DataAnnotations來驗證表單(通常[Required]屬性,有時顯示名稱更改)。

我不想把這些屬性放在服務引用文件中,因爲更新引用意味着我將失去這些屬性(至少我不能確定引用更新後所有東西都是一樣的)。

我的想法是創建子類,它只會作爲工具將DataAnnotations引入到屬性中,我知道我肯定會使用這些類型(肯定不會從DataContract類中消失)。我將如何完成代碼的這種繼承?

例子 - 我有這個類由VS在reference.cs文件中創建:

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")] 
[System.Runtime.Serialization.DataContractAttribute(Name="LibraryRequest", Namespace="http://schemas.datacontract.org/2004/07/Agamemnon.Models")] 
[System.SerializableAttribute()] 
public partial class LibraryRequest : DocuLive.RepositoryServiceExt.Library { 

    [System.Runtime.Serialization.OptionalFieldAttribute()] 
    private string PasswordField; 

    [System.Runtime.Serialization.OptionalFieldAttribute()] 
    private string ServerField; 

    [System.Runtime.Serialization.OptionalFieldAttribute()] 
    private bool UseDefaultField; 

    [System.Runtime.Serialization.OptionalFieldAttribute()] 
    private string UserNameField; 

    [System.Runtime.Serialization.DataMemberAttribute()] 
    public string Password { 
     get { 
      return this.PasswordField; 
     } 
     set { 
      if ((object.ReferenceEquals(this.PasswordField, value) != true)) { 
       this.PasswordField = value; 
       this.RaisePropertyChanged("Password"); 
      } 
     } 
    } 

    [System.Runtime.Serialization.DataMemberAttribute()] 
    public string Server { 
     get { 
      return this.ServerField; 
     } 
     set { 
      if ((object.ReferenceEquals(this.ServerField, value) != true)) { 
       this.ServerField = value; 
       this.RaisePropertyChanged("Server"); 
      } 
     } 
    } 

    [System.Runtime.Serialization.DataMemberAttribute()] 
    public bool UseDefault { 
     get { 
      return this.UseDefaultField; 
     } 
     set { 
      if ((this.UseDefaultField.Equals(value) != true)) { 
       this.UseDefaultField = value; 
       this.RaisePropertyChanged("UseDefault"); 
      } 
     } 
    } 

    [System.Runtime.Serialization.DataMemberAttribute()] 
    public string UserName { 
     get { 
      return this.UserNameField; 
     } 
     set { 
      if ((object.ReferenceEquals(this.UserNameField, value) != true)) { 
       this.UserNameField = value; 
       this.RaisePropertyChanged("UserName"); 
      } 
     } 
    } 
} 

我想,以確保無論在reference.cs文件有什麼變化(甚至是類本身),我會我的「編輯」和「刪除」表單中始終有用戶名,密碼和服務器標記爲[必需]。

在此先感謝

洪扎

回答

0

我將繼承一個自動生成的類望而卻步。它不能解決你的屬性問題 - 你必須重寫每一個屬性,所以你可以添加屬性。

一個解決方案是使用手動編碼的數據合同代替自動生成的引用。你可以完全控制它們什麼時候改變,你可以把你需要的屬性放在它們中。

另一種解決方案是將合同包裝在視圖模型中。就像這樣:

public class LibraryRequestViewModel { 
    private LibraryRequest request; 

    public LibraryRequestViewModel(LibraryRequest request){ 
      this.request = request; 
    } 

    [Required] 
    public string Password { 
     get { return this.request.Password; } 
     set { this.request.Password = value; } 
    } 
    // do this for all fields you need 
    } 
+1

我不願意NAD碼datacontracts因爲還有很多的服務的變化,這將迫使我一個星期重寫datacontracts幾次。我絕對喜歡viewModel的建議,我會試一試 - 我仍然需要做一些調整,但看起來它會少得多。 – Erchi 2013-05-17 11:38:24