我想在.Net核心中创建一个名为CheckIfEmailExists的自定义验证属性。我想确保用户不在我的数据库中。这就是我的创建用户视图模型:
public class CreateUserViewModel
{
public readonly UserManager userManager;
public CreateUserViewModel()
{
}
public ExtendedProfile ExtendedProfile { get; set; }
public User User { get; set; }
public int SchemeId { get; set; }
public SelectList Schemes { get; set; }
[Required]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
[CheckIfEmailExists()]
[Display(Name = "Email Address")]
public string Email { get; set; }
[DataType(DataType.EmailAddress)]
[Display(Name = "Confirm Email Address")]
public string ConfirmEmail { get; set; }
}
这是我的自定义验证:
public class CheckIfEmailExists : ValidationAttribute
{
private readonly UserManager _userManager;
public CheckIfEmailExists(UserManager userManager)
{
var _userManager = userManager;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var user = (User)validationContext.ObjectInstance;
var result = _userManager.FindByEmailAsync(user.Email).Result;
//do something
return ValidationResult.Success;
}
}
在我的电子邮件属性上添加自定义验证时出现错误,该错误是我必须将usermanager对象传递给自定义类构造函数。
为什么我的应用程序不只是注入对象本身? 有没有一种方法可以在我的自定义类中创建用户管理器对象而无需耦合类? 我应该只在控制器中访问数据库吗?
预先感谢:)
答案 0 :(得分:0)
上面Nikki9696的评论对我有所帮助,现在我知道如何在我的自定义验证属性中获取用户管理器和dbcontext。
public class IsEmailInDatabase : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var context = (DatabaseContext)validationContext.GetService(typeof(DatabaseContext));
if (value == null)
{
return null;
}
else
{
var results = context.Users.AnyAsync(x => x.Email == value.ToString());
if (results.Result)
{
return new ValidationResult("This email address already exists in our database");
}
return null;
}
}
}