避免验证隐藏字段(服务器端)



我正在使用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方法产生至少一个错误,则不会验证您的数据注释。因此,如果您要使用此方法,我建议删除您的数据注释。

希望这对你有帮助。

最新更新