从客户端禁用服务器端验证的通用解决方案

本文关键字:解决方案 验证 服务器端 客户端 | 更新日期: 2024-04-03 07:41:55

我有这样一个场景。

包含两个不同DropDownList的两个div。这两个div的可见性都由客户端的两个独立复选框控制,并且两个DropDownList都有必需的字段验证器,我希望在div隐藏时禁用这些验证器(即:复选框未选中)。

因此,知道有一种方法可以让你禁用字段验证器客户端,我做了一个快速搜索,重新找到了ValidatorEnable(Validator, Boolean);。在连接完所有内容后,如果复选框未选中,我的客户端验证将被成功忽略,但问题是一旦我进入服务器端。

在服务器上使用类似的典型场景

protected void btnSave_Click(object sender, EventArgs e)
{
    Page.Validate();
    if (Page.IsValid) 
    {
    }
}

在服务器端——我的直觉告诉我这应该对双方都有影响,这让我非常惊讶——页面验证将继续报告IsValid = false。所以我用下面的代码运行了一些测试。。。

$(Page_Validators).each(function (index, value) {
    ValidatorEnable(value, false);
});

并很快确认ValidatorEnable方法实际上只影响客户端验证,而不影响字段验证器的服务器端状态。

现在,我可能会不假思索地想出几个方法来"巧妙"地处理这个问题。例如:在回发时选中复选框状态,根据需要禁用验证器,设置一些隐藏字段等。但问题是,我在超大项目中使用此功能,并且我应用的标准将在未来的所有表单中使用。

因此,基本上我希望找到一个通用的解决方案,它不需要对ASP.NET中的字段验证器所提供的典型简单性进行重大更改。有什么想法吗?

PS:我刚刚意识到,如果我不小心,我可能会引入一个安全漏洞,对吧?这可能就是微软默认不这么做的原因。

从客户端禁用服务器端验证的通用解决方案

可以使用一种非常简单的方法,即为每个验证器使用一个隐藏字段,并通过客户端输入、操作或任何您想要的操作,只需通过javascript在这些隐藏字段中填充一些自定义值,如true和false。

当表单返回时,您可以检查隐藏字段值是否为true或false,根据这些值,您可以启用或禁用服务器端验证器。