【问题标题】:Avoid Validation of Hidden Fields (Server Side)避免验证隐藏字段(服务器端)
【发布时间】:2014-07-29 00:03:46
【问题描述】:

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

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

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

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

附言我已经查看了 Google,但没有找到任何优雅的解决方案 - 我觉得这应该很容易做到。

【问题讨论】:

  • 查看RequiredIf 验证。
  • 虽然我还没有找到很多关于我的问题的明确性 - 很多消息来源说 MVC 默认不应该尝试验证隐藏字段 -
  • 什么是验证?不显眼的验证纯粹是客户端,对吧?

标签: .net asp.net-mvc validation


【解决方案1】:

这里有一个快速的解决方案

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

希望这会有所帮助。

【讨论】:

  • 这是否适用于非侵入式验证 AJAX? (即它是否适用于内置客户端验证)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 2019-10-04
  • 1970-01-01
相关资源
最近更新 更多