asp.net中继器"the server tag is not well formed"

asp.net repeater "the server tag is not well formed"

在将我打倒或标记为重复之前,我已经查看但无法在此处找到我的答案,尽管存在类似的问题 - 大多数与 javascript 对 asp.net 控件的调用有关。这不是那个。

我正在尝试根据绑定到转发器的数据源中的值向转发器中的复选框提供一个 ID。

对于非 asp.net 控件的元素,我没有遇到任何问题,但是当涉及到将它提供给复选框时,如下例所示,我收到错误

Error creating control - rptPayments

The server tag is not well formed.

这就是我现在尝试命名的方式

<asp:CheckBox runat="server" ID="cbValidated_<%# Eval("ContactId")%>" />

我看到有很多关于类似问题的问题,但通常它们是针对 javascript \ OnClientClick(..) 函数告诉人们使用单引号的。

如果我尝试使用单引号,我会收到一个新错误

the ID property of a control can only be set using the ID attribute in the tag and a simple value. Example

我需要它作为服务器端控件,这样我就可以通过单击按钮循环遍历所有复选框,以查看哪些记录已经过验证,但需要 link 它与 contactId

我假设您的 bulk-update 按钮位于中继器外部。在那种情况下,您将让您遍历转发器项目并像这样继续:-

protected void btnUpdate_Click(object sender, EventArgs e)
{
    foreach (RepeaterItem item in MyRepeater.Items)
    {
        CheckBox cbValidated = item.FindControl("cbValidated") as CheckBox;
        if (chkTest.Checked)
        {
            //Do Stuff (You can save some custom values in a list and finally update all)
        }
    }
}

更新:

如评论中所述,正确的方法是将记录的 ID 存储在隐藏变量中,而不是将其设置为控件的 ID(无论如何这是不可能的) .所以只需像这样添加一个隐藏字段:-

<ItemTemplate>
   <asp:CheckBox ID="cbValidated" runat="server" Text='<%# Eval("foo") %>' />
   <asp:HiddenField ID="hdnID" runat="server" Value='<%# Eval("ID") %>' />
</ItemTemplate>

此处,ID 是将映射到您的记录的列的名称。如果用户选中了这样的复选框,那么只需找到这个值:-

//Rest code same as mentioned above
if (chkTest.Checked)
{
    HiddenField hdnID = item.FindControl("hdnID") as HiddenField;
    string id = hdnID.Value; //use this id for your logic. 
}