【问题标题】:ASP.NET Repeater Control Checkbox issueASP.NET 中继器控制复选框问题
【发布时间】:2013-01-23 18:26:07
【问题描述】:

概述:单击中继器控件中第一个 CheckBox 的 text 会单击 最后一个。我知道为什么会这样; label 标签与元素 id chkMarkedForDeletion 的关联,当单击该标签时,它会选择最后一个 CheckBox,因为所有 CheckBox 都具有相同的 ID.. 该死的转发器控制!我想知道是否有任何方法可以避免这种情况?简单的方法是创建单独的标签并正确关联到每个 CheckBox,但这会破坏 CheckBox 的假定默认行为。

中继码:

<asp:Repeater ID="childNodesDataRepeater" runat="server">
    <ItemTemplate>
        <table style="width: 100%;" cellpadding="0" cellspacing="0" border="0">
            <tr>
                <td style="width: 200px;">
                    <asp:CheckBox ID="chkMarkedForDeletion" runat="server" EnableViewState="true" Text="Remove"
                        Checked='<%# DataBinder.Eval(Container.DataItem, "IsMarkedForDeletion") %>' />
                </td>
                <td>
                    &nbsp;
                </td>
                <td style="width: 200px;">
                    <asp:CheckBox ID="chkHighImpactCause" runat="server" EnableViewState="true" Text="High Impact Cause"
                        Checked='<%# DataBinder.Eval(Container.DataItem, "IsHighPriority") %>' />
                </td>
            </tr>
            <tr>
                <td colspan="3">
                    <asp:Label ID="header002" runat="server" Text="What caused this problem?" />
                </td>
            </tr>
            <tr>
                <td colspan="3">
                    <asp:TextBox ID="txtProblemCausedBy" runat="server" EnableViewState="true" Width="100%"
                        Text='<%# DataBinder.Eval(Container.DataItem, "Description") %>' /><br />
                </td>
            </tr>
            <tr>
                <td colspan="3" style="height: 5px;">
                    <hr />
                    <asp:HiddenField ID="nodeIdentifier" runat="server" EnableViewState="true" Value='<%# DataBinder.Eval(Container.DataItem, "AnalysisID") %>' />
                </td>
            </tr>
        </table>
    </ItemTemplate>
</asp:Repeater>

为 CheckBox 生成的 HTML 代码:

<INPUT id=chkMarkedForDeletion type=checkbox name=TabContainer$tabProblemResolution$frmProblemResolution1$childNodesDataRepeater$ctl00$chkMarkedForDeletion>
<LABEL for=chkMarkedForDeletion>Remove</LABEL>
...
...
<INPUT id=chkMarkedForDeletion type=checkbox name=TabContainer$tabProblemResolution$frmProblemResolution1$childNodesDataRepeater$ctl02$chkMarkedForDeletion>
<LABEL for=chkMarkedForDeletion>Remove</LABEL>

问题:

谢谢, 阿比

【问题讨论】:

  • 您运行的是什么 ASP.NET 版本,您的客户端 ID 生成策略是什么?
  • Asp.NET 4.0;客户端 ID 生成策略是默认的,我没有将其标记为静态。我尝试更改客户端 ID 生成。政策,但并没有太大的不同。 :(
  • 它应该会自动生成不同的 ID,除非您设置 ClientIDMode=Static。这是否发生在其他中继器上?
  • 您是否逐字复制了生成的 HTML?
  • @RomanRoyter 我还没有尝试过其他中继器。 @ Mike 不,我是从 IE 开发工具中复制的,而不是从源代码中复制的,我在那里找不到为转发器生成的任何内容。

标签: c# asp.net repeater


【解决方案1】:

确保中继器上的ClientIDMode 未设置为“静态”。

此设置可从父级继承,一直到 web.config。因此,如果您必须在中继器上显式设置 ClientIDMode,这意味着某些父级将默认(可预测)覆盖为“静态”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多