在 c# 中使用来自控制台应用程序的数据注释仅验证模型 class 的几个属性

Validate only few properties of a model class using Data Annotations from a Console application in c#

我有一个模型 class 具有如下几个属性,每个 属性 都有用于验证的数据注释

Class User{

[Required]
public string First Name{get;set;}

[Required]
public string Last Name {get;set;}

[Required, EmailAddress, MaxLength(256), Display(Name = "Email Address")]
public string Email {get;set;}

[Required, MaxLength(20), DataType(DataType.Password), Display(Name ="Password")]
public string Pasword {get;set;}
}

现在,在控制台应用程序中,我要求用户提供电子邮件地址和密码以进行登录。我如何验证给定的电子邮件和密码是否满足条件。由于是登录,我不想验证名字和姓氏

var context = new ValidationContext(user);
var results = new List<ValidationResult>();

var isValid = Validator.TryValidateObject(user, context, results, true);

TryValidateObject 将一个实例作为第一个参数,所以当我这样做时它也会 returns 我的名字和姓氏出错

有人可以建议我如何使用同一用户只验证电子邮件和密码吗?class?

如果您的应用程序的不同部分需要不同的设置或属性和验证规则,那么您应该为此目的使用完全不同的模型。所以你可以有一个像这样的新模型:

public class UserCredentials
{
    [Required, EmailAddress, MaxLength(256), Display(Name = "Email Address")]
    public string Email {get;set;}

    [Required, MaxLength(20), DataType(DataType.Password), Display(Name ="Password")]
    public string Password {get;set;}
}

现在你的代码看起来像这样可以工作了:

UserCredentials userCredentials = .... //Get the credentials from somewhere

var context = new ValidationContext(userCredentials);
var results = new List<ValidationResult>();

var isValid = Validator.TryValidateObject(userCredentials, context, results, true);

此外,如果您想与用户共享此代码 class,您可以使用继承:

public class User : UserCredentials
{
    [Required]
    public string FirstName{ get; set; }

    [Required]
    public string LastName { get; set; }
}

我会将 class 拆分为用户名和密码的基础 class,并从中创建一个 class 来保存用户名和密码。

像这样:

Class User : AuthUser {

    [Required]
    public string First Name{get;set;}

    [Required]
    public string Last Name {get;set;}

}

Class AuthUser {
    [Required, EmailAddress, MaxLength(256), Display(Name = "Email Address")]
    public string Email {get;set;}

    [Required, MaxLength(20), DataType(DataType.Password), Display(Name ="Password")]
    public string Pasword {get;set;}
}