我正在使用jQuery Unobtrusive validation来验证表单上的字段。
我希望表单中的字段有条件可见。例如,如果用户选择了一个复选框,将出现几个字段。
我得到了所有这些工作,但是如果用户提交一个表单,其中包含用RequiredAttribute标记的隐藏字段,那么表单将无法成功验证,因为它认为隐藏字段是空白的(注意:我谈论的是服务器端的验证-客户端验证是按预期工作的)。
如何从服务器端验证过程中排除隐藏字段?
注。我已经在谷歌上看了,我没有找到任何优雅的解决方案,我觉得这应该是很容易做到的。
这里有一个快速的解决方案
从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方法产生至少一个错误,则不会验证您的数据注释。因此,如果您要使用此方法,我建议删除您的数据注释。
希望这对你有帮助。