我正在使用jQuery Unobtrusive验证来验证表单上的字段。
我希望表单中的字段有条件可见。例如,如果用户选中一个复选框,则会出现几个字段。
我完成了所有这些工作,但如果用户提交的表单包含使用RequiredAttribute标记的隐藏字段,则表单将无法成功验证,因为它认为隐藏字段为空(注意:我正在说话)关于服务器端的验证 - 客户端验证按预期工作。)
如何从服务器端验证过程中排除隐藏字段?
P.S。我已经看过谷歌了,我没有找到任何优雅的解决方案 - 我觉得这应该是容易做的事。
答案 0 :(得分:0)
这是一个快速解决方案
从IValidatableObject继承您的模型类并覆盖Validate方法。然后,您可以写出条件并在覆盖中验证它们。
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
//Custom Validation
}
例如,假设我们有以下模型
public class PersonModel : IValidatableObject
{
public String Name { get; set; }
public bool IsChecked { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
//We only want to validate the name if the user has checked the checkbox(IsChecked)
if(IsChecked && string.IsNullOrEmpty(Name))
{
yield return new ValidationResult("Name is required");
}
if(IsChecked && Name.Length > 20)
{
yield return new ValidationResult("Name cannot exceed more than 20 characters");
}
}
}
使用IValidateObject方法的唯一缺点是它并不总是与数据注释很好。例如,如果Validate方法至少产生一个错误,那么您的数据注释将无法验证。因此,如果您要使用此方法,我建议您删除数据注释。
希望这会有所帮助。