【发布时间】:2012-05-16 16:08:14
【问题描述】:
在 ASP.NET 中,RequiredFieldValidator 仍然验证文本框控件,即使我在客户端禁用它也是如此。我想通过使用CustomValidator 来摆脱这种行为。在验证功能中,我检查是否启用了文本框。如果是这种情况,我将验证器设置为有效。
function ValidateTextBox(sender, args) {
var $textbox = $('#txtFoo')
args.isValid = $textbox.prop('disabled') || $textbox.val();
}
这在客户端运行良好。问题是,我使用 JavaScript 在客户端更改了文本框的状态。因此,服务器不知道更改的状态(文本框控件现在已禁用)。因此,当引发自定义验证器的ServerValidate 事件时(例如通过调用Page.Validate),我无法检查文本框是否被禁用。因为服务器不知道这一点,所以无论我在客户端做什么,Enabled 属性始终设置为 true。
在Postback期间如何禁用控件验证或告诉服务器文本框的状态?
感谢您的宝贵时间。
【问题讨论】:
-
服务器能否从其他控件(或页面其余部分)的状态中判断文本框是否会在客户端被禁用?最安全的验证方法就是复制您当前拥有的客户端逻辑,因为无论如何,所有客户端脚本和表单值都可以通过通用调试工具进行更改。
-
这肯定行得通。我正在使用用户控件将标签输入字段和验证器组合到一个控件中。如果控件可以自动处理,而不必依赖于它所使用的页面的代码,那就太好了。我的意思是这就是 ASP.NET 验证控件的优势。您不必手动检查每个控件的状态。您只需要调用 Page.Validate 就可以了。
-
当使用 JavaScript 更改文本框的值时,服务器知道这一点,因为它的值将被发送回服务器。是否可以使用这种机制额外发送文本框的禁用状态及其值?
-
我没有检查这是否有效,因为一个快速的解决方案是在回发期间更改服务器上控件的状态。该项目现在已经完成,但也许解决方案是使用 HTML5 数据属性来呈现控件验证器的客户端 ID。在客户端禁用控件时,您可以调用函数 ValidatorEnable 并传递存储在 data 属性中的验证器的 ID。如果这也会禁用服务器端的验证器,那么问题就解决了,否则就不行了。
标签: asp.net validation requiredfieldvalidator customvalidator