【问题标题】:disable asp.net validator using jquery使用 jquery 禁用 asp.net 验证器
【发布时间】:2010-12-11 09:41:57
【问题描述】:

我正在尝试使用 jquery 禁用验证器。

我已经看过了 Disable ASP.NET validators with JavaScript 和其他几个人也在做同样的事情。

它似乎没有工作,但它打破了。

我的代码:

$('.c_MyValdiators').each(function() {

    var x = $(this).attr('id');
    var y = document.getElementById(x);
    ValidatorEnable(y[0], false);
});

我得到错误: val 未定义 [打破这个错误] val.enabled = (enable != false);\r\n

如果我使用

$('.c_MyValdiators').each(function() {
    ValidatorEnable($(this), false); OR ValidatorEnable($(this[0]), false);
  });

我得到错误:

val.style 未定义 [打破这个错误] val.style.visibility = val.isvalid ? “隐藏”:“可见”;\r\n

有什么想法或建议吗?

【问题讨论】:

  • 作为基本的故障排除技巧,您可能首先想查看传递给您的函数的内容。 x 或 y 返回什么?

标签: asp.net javascript jquery


【解决方案1】:

我相信 ValidatorEnable 采用 ASP.net ID 而不是 ASP.net 生成的 ClientID。您还需要在 CodeBehind 中设置验证条件。

这是一个例子:

特别有用的是能够启用或禁用验证器。如果您有验证只希望在某些场景下激活,您可能需要在服务器和客户端都更改激活,否则您会发现用户无法提交页面。

这是前面的示例,其中包含仅在未选中复选框时才应验证的字段:

public class Conditional : Page {
    public HtmlInputCheckBox chkSameAs;
    public RequiredFieldValidator rfvalShipAddress;
    public override void Validate() {
        bool enableShip = !chkSameAs.Checked;
        rfvalShipAddress.Enabled = enableShip;
        base.Validate();
    }
}

这是客户端等效项:

<input type=checkbox runat=server id=chkSameAs 
   onclick="OnChangeSameAs();" >Same as Billing<br>
<script language=javascript>
function OnChangeSameAs() {
    var enableShip = !event.srcElement.status;
    ValidatorEnable(rfvalShipAddress, enableShip);
}
</script>

参考:http://msdn.microsoft.com/en-us/library/aa479045.aspx

【讨论】:

  • 感谢您的回复。 MSDN 链接非常适合将来参考。因为我在 ascx 文件中,所以我没有任何 validate() 可以覆盖。尽管使用了这么多尝试,但我才让它工作: ValidatorEnable(document.getElementById($(this).attr('id')), true);还有一个问题,由于这只是在客户端启用/禁用,我如何禁用我的验证器,因为它们在页面回发时被禁用?有什么想法吗?
  • 您可能只想使用基于条件进行检查的自定义客户端脚本创建一个 CustomValidator。我在上面发布的链接也显示了如何做到这一点
【解决方案2】:

我 [一年后] 偶然发现了您的问题。 我也想使用 JQuery 禁用页面上的所有验证器,这就是我的处理方式。

$('span[evaluationfunction]').each(function(){ValidatorEnable(this,false);});

我在页面上查找具有评估函数属性的每个跨度,然后为每个跨度调用 ValidatorEnabled。

我认为您的代码中的 $('this') 部分是导致打嗝的原因。

【讨论】:

    【解决方案3】:
    ValidatorEnable(document.getElementById($(this).attr('id')), true); 
    

    【讨论】:

      【解决方案4】:

      我有另一种解决方案,即使用 span 标签的 'enabled' 属性作为验证器。我在一个可以显示或隐藏的表单上有不同的 div,所以我需要禁用对隐藏 div 内的字段的验证。此解决方案在不触发验证的情况下关闭验证。

      如果你有一组RequiredFieldvalidator 控件,它们都包含一个公共字符串,你可以用它来抓取它们,jquery 是这样的:

      $("[id*='CommonString']").each(function() {
          this.enabled = false;   // Disable Validation
      });
      
      or
      
      $("[id*='CommonString']").each(function() {
          this.enabled = true;    // Enable Validation
      });
      

      希望这会有所帮助。

      约翰

      【讨论】:

        【解决方案5】:

        我只是遇到了同样的问题,感谢其他答案,因为它有助于发现问题,但他们没有详细说明原因。

        我相信这是因为 ValidatorEnable() 需要一个与 ID 相对的 DOM 对象(即验证控制对象)。

        $(selector).each() 将“this”设置为当前正在迭代的 DOM 元素,即从 jquery 文档中引用:

        "更重要的是,回调是在当前的上下文中触发的 DOM 元素,所以关键字 this 指的是元素。” - http://api.jquery.com/each/

        因此您不需要这样做:document.getElementById($(this).attr('id')

        ValidatorEnable(this, true); 很好。

        有趣的是,Russ 的回答也提到需要禁用服务器端验证,这确实有道理 - 但我不需要这样做(这令人担忧!)。

        取消我之前的评论,这是因为我之前在服务器端禁用了我的控件。

        【讨论】:

          【解决方案6】:

          ValidatorEnable 函数将对象作为第一个参数,而不是对象 id 的字符串。

          【讨论】:

            【解决方案7】:

            这是处理此问题的简单方法。

            向 Validation 控件添加一个新类。

            然后使用 jquery 查找该类并禁用该控件。

            例子:

            if (storageOnly == 1)
               {
                    $('#tblAssignment tr.assdetails').addClass('hidden');
            
                    $('span[evaluationfunction]').each(function ()
                    {
                        if ($(this).hasClass('assdetail'))
                        { ValidatorEnable(this, false); }
                    });
                }
                else
                {
                    $('#tblAssignment tr.assdetails').removeClass('hidden');
                }
            

            * 就像一个魅力。 ** 对于您富有想象力的类型,assdetail == assignment detail。

            根据 if 条件,我要么隐藏行然后禁用验证器,要么从行中删除隐藏类..

            【讨论】:

              【解决方案8】:
              猜你喜欢
              • 2010-09-28
              • 2011-01-23
              • 1970-01-01
              • 2012-05-02
              • 1970-01-01
              • 1970-01-01
              • 2011-01-10
              • 2018-01-13
              • 1970-01-01
              相关资源
              最近更新 更多