我正在嘗試使用 mongodb 和 .NET Core 制作 API。但是我在更新值時遇到了問題。我寫了一個這樣的自定義驗證:
public class EmailUserUniqueAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
UserService? _context = validationContext.GetService(typeof(UserService)) as UserService;
var entity = _context?.Users().Find(x => x.Email == value.ToString()).FirstOrDefault();
if (entity != null)
{
return new ValidationResult(GetErrorMessage(value.ToString()));
}
return ValidationResult.Success;
}
public string GetErrorMessage(string email)
{
return $"Email {email} is already in use.";
}
}
我創建了一個自定義 Dto 來更新用戶資料,如下所示:
public class UpdateUserRequestDto
{
[Required]
public string UserName { get; set; }
[Required,DataType(DataType.EmailAddress),EmailUserUnique]
public string Email { get; set; }
[Required, MinimumAgeValidator(18)]
public DateTime DateOfBirth { get; set; }
}
要創建一個新用戶,它作業正常。但是在更新值時,它僅在Email值更改時才起作用。但是,當我使用同一封電子郵件提交更新時,它會顯示驗證錯誤。
我該如何解決這個問題?
uj5u.com熱心網友回復:
如評論中所述,您需要一個唯一值,例如ID確定在搜索具有重復電子郵件地址的檔案時應排除當前(待更新)檔案。
假設UserName是唯一的,
在EmailUserUniqueAttribute你需要:
UserName從 的實體中獲取屬性的值validationContext。- 搜索具有相同
Email但不同的記錄/檔案UserName(排除當前檔案)。
public class EmailUserUniqueAttribute : ValidationAttribute
{
#nullable enable
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var usernameProperty = validationContext.ObjectType.GetProperty("UserName");
var usernameValue = usernameProperty.GetValue(validationContext.ObjectInstance);
UserService? _context = validationContext.GetService(typeof(UserService)) as UserService;
var entity = _context?.Users().FirstOrDefault(x => x.Email == value.ToString()
&& x.UserName != usernameValue);
if (entity != null)
{
return new ValidationResult(GetErrorMessage(value.ToString()));
}
return ValidationResult.Success;
}
#nullable disable
...
}
.NET Fiddle 演示示例
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486766.html
標籤:C# mongodb asp.net 核心 asp.net-core-webapi
上一篇:ASP.NETCore啟動類中的services.Add和app.Use有什么區別?
下一篇:C#中串列物件的LINQ查詢
