网站首页 网站源码
using System.ComponentModel.DataAnnotations;
namespace Dpz.Core.Auth.Models;
public class ChangePasswordModel : IValidatableObject
{
/// <summary>
/// 当前密码
/// </summary>
[Required(ErrorMessage = "请输入当前密码")]
[Display(Name = "当前密码")]
public string? Password { get; set; }
/// <summary>
/// 新密码
/// </summary>
[Required(ErrorMessage = "请输入新密码")]
[StringLength(100, MinimumLength = 8, ErrorMessage = "新密码长度必须在8-100个字符之间")]
[RegularExpression(
@"^[\x21-\x7E]{8,}$",
ErrorMessage = "新密码只能包含ASCII可打印字符,不能包含空格"
)]
[Display(Name = "新密码")]
public string? NewPassword { get; set; }
/// <summary>
/// 新密码确认
/// </summary>
[Required(ErrorMessage = "请确认新密码")]
[Display(Name = "确认新密码")]
public string? NewRepeatPassword { get; set; }
/// <summary>
/// 双因素验证码(如已启用)
/// </summary>
[StringLength(6, MinimumLength = 6, ErrorMessage = "验证码必须为6位数字")]
[RegularExpression(@"^\d{6}$", ErrorMessage = "验证码必须为6位数字")]
[Display(Name = "双因素验证码")]
public string? PinCode { get; set; }
/// <summary>
/// 自定义验证逻辑
/// </summary>
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
// 验证新密码确认
if (!string.IsNullOrEmpty(NewPassword) && !string.IsNullOrEmpty(NewRepeatPassword))
{
if (NewPassword != NewRepeatPassword)
{
yield return new ValidationResult(
"新密码与确认密码不匹配",
new[] { nameof(NewRepeatPassword) }
);
}
}
// 验证新密码不能与当前密码相同
if (!string.IsNullOrEmpty(Password) && !string.IsNullOrEmpty(NewPassword))
{
if (Password == NewPassword)
{
yield return new ValidationResult(
"新密码不能与当前密码相同",
new[] { nameof(NewPassword) }
);
}
}
}
}上述代码定义了一个名为 ChangePasswordModel 的 C# 类,主要用于处理用户更改密码的请求。这个类实现了 IValidatableObject 接口,允许自定义验证逻辑。以下是代码的详细解释:
Password:
string?(可空字符串)[Required]:此属性是必填的,用户必须输入当前密码。[Display]:用于在用户界面上显示的名称。NewPassword:
string?[Required]:此属性是必填的,用户必须输入新密码。[StringLength]:限制新密码的长度在8到100个字符之间。[RegularExpression]:新密码只能包含ASCII可打印字符,并且不能包含空格。[Display]:用于在用户界面上显示的名称。NewRepeatPassword:
string?[Required]:此属性是必填的,用户必须确认新密码。[Display]:用于在用户界面上显示的名称。PinCode:
string?[StringLength]:限制验证码的长度为6位。[RegularExpression]:验证码必须是6位数字。[Display]:用于在用户界面上显示的名称。Validate 方法实现了 IValidatableObject 接口,提供了自定义的验证逻辑:
新密码确认:
NewPassword 和 NewRepeatPassword 是否相同。如果不相同,返回一个验证错误,提示“新密码与确认密码不匹配”。新密码与当前密码相同:
Password 和 NewPassword 是否相同。如果相同,返回一个验证错误,提示“新密码不能与当前密码相同”。这个类的主要功能是封装用户更改密码所需的信息,并提供必要的验证逻辑,以确保用户输入的密码符合安全要求和一致性。通过使用数据注解和自定义验证,确保了输入的有效性和安全性。
