使用DataAnnotations验证继承的属性

时间:2013-05-14 14:22:42

标签: c# web-services validation asp.net-mvc-4 data-annotations

我有MVC项目依赖于webservices来提供数据,而这些web服务基于具有自定义功能的CMIS规范。我有几个用作DataContracts的类,当我添加对我正在调用的服务的引用时,它是由Visual Studio创建的。我正在使用该类作为模型,以确保我能够将实例发送到服务并正确处理发送给我的那些。

我也有编辑这些类的实例的视图,我想使用DataAnnotations来验证表单(通常[必需]属性,有时显示名称更改)。

我不想将这些属性放在服务引用文件中,因为更新引用意味着我将丢失这些属性(至少我不能确定参考更新后所有内容仍然相同)。

我的想法是创建子类,它只能作为工具将DataAnnotations引入我知道肯定会使用的属性(那些不会从DataContract类中消失的东西)。我如何用代码完成这种继承?

示例 - 我在reference.cs文件中创建了由VS创建的这个类:

[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文件中的哪些更改(即使是该类本身),我仍然会在“编辑”和“删除”表单中将用户名,密码和服务器标记为[必需]。

提前致谢

洪扎

1 个答案:

答案 0 :(得分: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
  }