为中继器内的复选框创建标签

Creating a Label for a checkbox inside a repeater

<asp:Repeater runat="server" ID="Repeater1" OnItemDataBound="countryDataBound">
  <HeaderTemplate>        
  </HeaderTemplate>
  <ItemTemplate>
    <div class="accordion">
      <span><h3><%# Eval("key") %>
      <div class="panelCountry">
        <input type="checkbox" runat="server" class="chbSelectAll"/><label>SelectAll</label>
        <asp:CheckBoxList 
           ID="chbListCountries" 
           CssClass="chbList"
           RepeatColumns="4" 
           RepeatDirection="Horizontal" 
           DataTextField ="Name"
           DataValueField = "CountryCode"
           runat="server">
           <asp:ListItem></asp:ListItem>
         </asp:CheckBoxList>
     </div> 
  </div>
  </ItemTemplate>
  <FooterTemplate>
  </FooterTemplate>
</asp:Repeater>

我有一个对话框,其中包含按大陆分组的世界上所有国家/地区的转发器。每个大陆都由 jquery 手风琴分隔。每个手风琴内部都有一个国家复选框列表,顶部有一个复选框,用作 select 全部。我需要将标签与 select 全部相关联,以便响应。我的意思是,如果我单击标签,我需要能够触发复选框 select 全部。 我考虑过

<label for="IDHERE">Select all</label>

但是我无法弄清楚如何正确定位复选框,以便当我单击特定标签时它只会 select 此特定复选框列表中的复选框。

是否可以为每个 "select all" 复选框创建一个与其他七个复选框不同的 ID,以便在单击标签时正确 select 各自手风琴中的复选框。 作为参考,单击复选框时 javascript 运行:

$(document).on('change', '.chbSelectAll', function (e) {
   var selectAllValue = $(this).prop('checked') 
   var panel = $(this).closest('.panelCountry');
   var checkboxes = panel.find('input[type=checkbox]:not(.chbSelectAll)');
   checkboxes.prop('checked',selectAllValue);                             
 });

Visual view of the problem

如果您不需要 runat=server 标签,您可以使用 ItemIndex 创建自己的标签 for=

<input type="checkbox" class="chbSelectAll" id="CheckBox_<%# Container.ItemIndex %>" />
<label for="CheckBox_<%# Container.ItemIndex %>">SelectAll</label>

但为什么不使用 aspnet CheckBox?那你就不会再有这个问题了。

<asp:CheckBox ID="CheckBox1" runat="server" Text="SelectAll" CssClass="chbSelectAll" />