在我的剃刀页面中有一个带有 3 个复选框的表单。必须选择一项才能保存提交。 我可以整天对此进行前端验证,但该项目现在需要后端验证。看起来似乎是一项简单的任务,但我被困住了!
在 SQL 中,我将三个布尔值设置为 0。验证必须在提交之前检查其中一个是否为真。 Blazor 代码如下。
PendingModel:
public string CriteriaMessage{get;set;}
public bool checkboxA{ get; set; }
public bool checkboxB{ get; set; }
public bool checkboxC{ get; set; }
PendingViewModel:
[NotMapped]
[Range(typeof(bool), "true", "true", ErrorMessage = "You must select at least one!")]
public bool validateCheckbox
{
get { return (checkboxA|| checkboxB|| checkboxC); }
}
Pending.razor:
<InputTextArea class="" id="" @bind-Value="PendingViewModel.CriteriaMessage" />
<ValidationMessage For = "@(()=>@PendingViewModel.CriteriaMessage)" />
<InputCheckbox class="" id="" @bind-Value="PendingViewModel.checkboxA" />
<InputCheckbox class="" id="" @bind-Value="PendingViewModel.checkboxB" />
<InputCheckbox class="" id="" @bind-Value="PendingViewModel.checkboxC" />
<ValidationMessage For = "@(()=>@PendingViewModel.validateCheckbox)" />
@code{
public void Save(
{
PendingViewModel = new();
}
}
我建议对表单使用 FluentValidation。它节省时间,并且可以应用于前端和后端。将您的复选框包装在 DTO 类中。并向您的 blazor 组件添加一个表单。
public class MyModel
{
public bool CheckboxA { get; set; }
public bool CheckboxB { get; set; }
public bool CheckboxC { get; set; }
}
public class MyModelValidator : AbstractValidator<MyModel>
{
public MyModelValidator()
{
RuleFor(x => x)
.Must(x => x.CheckboxA || x.CheckboxB || x.CheckboxC)
.WithMessage("At least one checkbox must be checked.");
//Add your own rules
}
}
//Usage - Later in a backend
var validator = new MyCheckboxModelValidator();
var results = validator.Validate(myModel);
对于 blazor EditForms,这里是带有示例的库: https://github.com/Blazored/FluentValidation