Blazor EditForm验证的具有多个值的海关验证属性



我想检查列A和列B的组合在我的blazor应用程序中是否唯一。使用ValidationAttribute检查列A是否唯一非常简单

public class MyClass
{
[IsUnique(ErrorMessage = "The entered value exists.")]
public string Code {get; set;}
}
public class IsUniqueAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var service = (DbService)validationContext.GetService(typeof(DbService))
bool exists = service.IsUnique((String)value);
if(exists == false)
{
return ValidationResult.Success;
}
return new ValidationResult(ErrorMessage, new[] { validationContext.MemberName });
}
}

然而,当涉及多个值时,我不知道如何做同样的事情。假设我想检查以下MyClass2的数据库中"代码+名称"是否唯一。

public class MyClass2
{
public string Code {get; set;}
public string Name {get;set;}
}

我尝试过使用自定义参数:

public class IsCodeNameCombinationUniqueAttribute : ValidationAttribute
{
public string Name{ get; set; }
public override bool IsValid(object value)
{
//Validate
}
}
public class MyClass2
{
[IsCodeNameCombinationUnique(ErrorMessage = "The combination of Code and Name exists.", Name = Name)]
public string Code {get; set;}
public string Name {get;set;}
}

但我似乎只能将常量传递到Name参数中。

有没有办法制作一个自定义ValidationAttribute来实现我想要的目标?

还是应该使用自定义验证器?(https://learn.microsoft.com/en-us/aspnet/core/blazor/forms-validation?view=aspnetcore-5.0#验证器组件(

您正在尝试的事情可以使用"等级";验证。

这可以通过实现";IValidatableObject";在您的模型类中,并在"中提供您的验证逻辑;验证";由";IValidatableObject";。

在您的情况下,

public class MyClass2 : IValidatableObject
{
public string Code {get; set;}
public string Name {get;set;}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var service = (DbService)validationContext.GetService(typeof(DbService))

bool exists = service.IsUniqueCombination(this.Code,this.Name);
if(exists)
{
yield return new ValidationResult("The combination of Code and Name exists.");
}
}
} 

相关内容

  • 没有找到相关文章

最新更新