使用DataAnnotations验证继承的属性

本文关键字:属性 继承 验证 DataAnnotations 使用 | 更新日期: 2023-09-27 18:13:23

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

我也有视图来编辑这些类的实例,我想使用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文件(甚至类本身)有什么变化,我将始终有用户名,密码和服务器标记为[Required]在我的"编辑"answers"删除"的形式。

Thanks in advance

Honza

使用DataAnnotations验证继承的属性

我会避免继承自动生成的类。这并不能解决你的属性问题——你必须重写每一个属性,这样你才能给它添加属性。

一个解决方案是使用手工编码的数据契约,而不是自动生成的引用。您可以完全控制它们何时更改,并且可以在其中添加所需的属性。

另一个解决方案是将契约包装在视图模型中。这样的:

 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
  }