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

时间:2012-07-11 08:50:26

标签: c# asp.net validation requiredfieldvalidator

我有一个这样的场景。

两个包含两个不同DropDownLists的div。这两个div的可见性都由两个独立的复选框控制客户端,并且两个DropDownLists都有必需的字段验证器,我希望在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方法仅影响客户端验证,并且保持字段验证器的服务器端状态不受影响。

现在我可能会想到几个方法,以“hackaly”处理这个问题。例如:检查回发时的复选框状态并根据需要禁用验证器,设置一些隐藏字段等。但问题是我在极大项目中使用此功能以及我的标准申请将在以后的所有表格中使用。

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

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

1 个答案:

答案 0 :(得分:0)

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

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