【问题标题】:jQuery Validation of ASP.Net CheckBoxListASP.Net CheckBoxList 的 jQuery 验证
【发布时间】:2012-02-07 13:07:25
【问题描述】:

在开始之前,我只想声明,由 ASP.NET 为 CheckBoxLists 创建的代码可能是我见过的最糟糕的事情。

不管怎样,

我正在使用 jQuery 验证插件来验证我的 ASP.net 表单。需要验证某些复选框。这些是由 CheckBoxList 控件生成的。

<asp:CheckBoxList ID="CBContext" runat="server" RepeatColumns="2" 
              DataSourceID="sqlLibraryEnquiries" DataTextField="value" DataValueField="value" name="topic">
</asp:CheckBoxList>

这个控件产生了以下可憎的 xHTML

<table id="MainContent_CBContext" name="topic">
    <tr>
        <td>
          <input id="MainContent_CBContext_0" type="checkbox" name="ctl00$MainContent$CBContext$0" value="Business" /><label for="MainContent_CBContext_0">Business</label>
        </td>
        <td>
          <input id="MainContent_CBContext_2" type="checkbox" name="ctl00$MainContent$CBContext$2" value="Legal" /><label for="MainContent_CBContext_2">Legal</label>
        </td>
    </tr>
    <tr>
        <td>
           <input id="MainContent_CBContext_1" type="checkbox" name="ctl00$MainContent$CBContext$1" value="Business Development" /><label for="MainContent_CBContext_1">Business Development</label>
        </td>
        <td>
           <input id="MainContent_CBContext_3" type="checkbox" name="ctl00$MainContent$CBContext$3" value="Library" /><label for="MainContent_CBContext_3">Library</label>
        </td>
    </tr>
</table>

我遇到的问题实际上是让 jQuery Validator 插件挂接到复选框列表中。在我的所有其他字段的规则部分中,我可以用他们的名字找到他们 例如 ctl00$MainContent$tbActions: 但复选框都有不同的名称。

cb_selectone 规则未触发,因为我尝试验证的对象从未找到。 我尝试了以下标识符。 CBContext、ctl00$MainContent$CBContext、MainContent_CBContext 和复选框。

$("#Form1").validate({

     rules: {
     //WHAT GOES HERE???? --------->>    CBContext or ctl00$MainContent$CBContext or MainContent_CBContext or checkboxes all don't work: {
            cb_selectone: true
         }
      }
});

感谢您的帮助。

SM

【问题讨论】:

  • 为什么你认为 asp 呈现复选框的方式令人厌恶?只是好奇...
  • 命名约定很烂,没有必要让每个人都有不同的名字,当他们有ID的时候。还有为什么是表而不是跨度?从 DOM 的角度来看,这并不容易。
  • 命名约定部分适用于所有实现 INamingContainer 接口的控件,我同意你的不同名称。另外,真的,为什么是表而不是跨度?或许这一切背后都有不为人知的秘密原因。
  • 我只是觉得它现在有点过时了。 M$ 将 jQuery 撬入 VS2010,但一些旧技术不是很兼容。 :-/

标签: jquery asp.net jquery-validate checkboxlist


【解决方案1】:

我在JAVASCRIPT方法中做了一个小调整:

$.validator.addMethod('cb_selectone',
    function (value) {
        if ($('[id$=CBContext] input:checked').length > 0) {
            return true;
        }
        else
        {
            return false;
        }
    }, ""
);

【讨论】:

  • 为什么不直接使用return ($('[id$=CBContext] input:checked').length &gt; 0)
【解决方案2】:

好的,我解决了......

我所做的是创建一个新的验证器方法,该方法获取与 MainContent_CBContext 的正则表达式匹配的所有输入类型对象。这将返回一个包含所有复选框的数组。

然后循环数组并检查是否检查了attr。如果其中任何一个被设置为 true。

$.validator.addMethod('cb_selectone', function (value, element) {
     if (debug) {
         $.jGrowl("Adding Validation");
     }
     var chkGroup = $("input[id^=MainContent_CBContext]");
     if (chkGroup.length > 0) {
         for (var i = 0; i < chkGroup.length; i++) {
             if ($(chkGroup[i]).attr('checked')) {
                 if (debug) {
                    // alert(i + $(chkGroup[i]).val());
                     $.jGrowl("Running loop " + i + " = " + $(chkGroup[i]).val());
                 }
                 return true;
             }
         }
         return false;
     }
     return false;
 }, 'Please select at least one option');

我坚持的部分是找到一个对象来触发 addMethod 代码。 最后我只是用了...

ctl00$MainContent$CBContext$2: {
   cb_selectone: true
}

这意味着标签放置在该字段旁边,它纯粹是为了装饰。重要的是验证器代码最终被绑定到一个真实的对象并正确触发。

SM

【讨论】:

    【解决方案3】:

    列表的呈现方式使其变得复杂。我会考虑创建自己的验证方法,并使用根控件的 ID,并让验证方法解析内部子项:

    【讨论】:

    • 这就是我想要做的。但它不会触发,因为它没有要附加的对象。
    • 好的,我解决了。一旦 stackoverflow 允许,我将发布详细信息。
    【解决方案4】:

    你有没有尝试过这样的事情:

    $("#Form1").validate({
         rules: {
            <%=CBContext.UniqueID %>: {
                cb_selectone: true
             }
          }
    });
    

    【讨论】:

    • 问题在于代码在 .js 文件中,所以
    • @smitchelluk 然后您需要将该语句从 JS 文件中拉出并放入页面中,或者提供一种解决方法。它可能在页面中使用了一个全局变量: var comboID = '';然后在JS文件中,引用comboID。我个人不喜欢这样,但它会起作用。
    • 恼人的是,这又是行不通的,因为 CBContext.UniqueID 返回 ctl00$MainContent$CBContext jQuery 没有看到一个名为 that 的对象,因为 ASP.Net 为每个名为 ctl00$MainContent$ 的项目创建输入字段CBContext$1,2,3.... 等。使用 UniqueID 是我验证所有其他字段的方式,但为此它不起作用。 :-/
    • 我猜你必须为那个 asp.net 控件创建自己的自定义验证器,或者使用基本的 html 复选框并给它们 runat="server" 属性,看看你是否有更好的运气。
    • 可能是这样的......function validateCB() { var valid = false; var i = 0; $.each($('#ctl00_ContentPlaceHolder1_CBContext :input'), function () { if ($(this).attr('checked') === 'checked') { if (i === 0) { valid = true; } i++; } }); if (i &gt; 1) { valid = false; } return valid; } 或者你为什么不直接使用单选按钮列表,因为默认情况下只允许你选择一个。
    【解决方案5】:
    $("input:checked") 
    

    选择器会抓取所有选中的复选框

    我已将其用于简单的验证,例如:

    function testChecks() {
        var n = $("input:checked").length;
        if (n > 6) {
            alert("Please select up to six attributes.");
            return false;
        }
        if (n < 1) {
            alert("You must select at least one attribute.");
            return false;
        }
        return true;
    }
    

    我想你可以这样做

    $("input:checked").add("input:not(:checked)").Validate({
    //....
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-18
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多