【发布时间】:2021-04-14 17:19:12
【问题描述】:
我希望能够创建一个自定义验证器,这将允许我连接到我的数据库并告诉我(例如)一个名称是否是唯一的。我曾经在 EF 中使用 [Remote] 属性,但我了解到您不能将其与 Blazor 一起使用。
我目前的验证码是这样的:
public class LandlordNameIsUniqueValidator : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
//This is always null
var context = (ApplicationDbContext)validationContext.GetService(typeof(ApplicationDbContext));
var checkName = new LandlordData(context);
var name = value.ToString();
var nameExists = checkName.CheckNameIsUnique(name);
if (!exists)
{
return null;
}
return new ValidationResult(ErrorMessage, new[] { validationContext.MemberName });
}
}
我使用的代码(在应用程序的其他部分成功)如下,这将返回一个布尔值:
public class LandlordData : ILandlordData
{
private readonly ApplicationDbContext _context;
public LandlordData(ApplicationDbContext context)
{
_context = context;
}
public bool CheckNameIsUnique(string name)
{
var exists = _context.Landlords
.AsNoTracking()
.Any(x => x.LandlordName == name);
return exists;
}
}
在StartUp.cs中如下:
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
_config.GetConnectionString("DefaultConnection")),
ServiceLifetime.Transient);
我还成功注册了此服务,并在我的 Blazor 页面中使用它。
services.AddTransient<ILandlordData, LandlordData>();
尽管多次尝试和不同的方法,我不能(更可能我不知道如何)注入DbContext,所以我可以使用LandlordData Class 来检查记录。
但我的ApplicationDbContext 始终为空!
谁能建议正确的方法来访问我的数据库以执行自定义验证。
TIA
【问题讨论】:
-
嗨@Rena,我被拉到了别的事情上,今晚我要试一试,所以我会回复你的。感谢您的帮助。
标签: c# validation asp.net-core blazor blazor-server-side