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

时间:2014-07-29 00:03:47

标签: .net asp.net-mvc validation

我正在使用jQuery Unobtrusive验证来验证表单上的字段。

我希望表单中的字段有条件可见。例如,如果用户选中一个复选框,则会出现几个字段。

我完成了所有这些工作,但如果用户提交的表单包含使用RequiredAttribute标记的隐藏字段,则表单将无法成功验证,因为它认为隐藏字段为空(注意:我正在说话)关于服务器端的验证 - 客户端验证按预期工作。)

如何从服务器端验证过程中排除隐藏字段?

P.S。我已经看过谷歌了,我没有找到任何优雅的解决方案 - 我觉得这应该是容易做的事。

1 个答案:

答案 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方法至少产生一个错误,那么您的数据注释将无法验证。因此,如果您要使用此方法,我建议您删除数据注释。

希望这会有所帮助。