我想在.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对象传递给自定义类构造函数。
为什么我的应用程序不只是注入对象本身?有没有一种方法可以在我的自定义类中创建用户管理器对象而无需耦合类?我应该只在控制器中访问数据库吗?
提前感谢:)
[Nikki9696的上述注释对我有所帮助,现在我知道如何在我的自定义验证属性中获取用户管理器和dbcontext,但是,我在这里没有注入任何内容。
受保护的覆盖ValidationResult IsValid(对象值,ValidationContext validateContext){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;
}
}