asp.net转发器"服务器标签格式不正确"

时间:2016-01-18 09:40:38

标签: asp.net .net repeater

在标记我之前,或者标记为重复之前我已经看过了,但是在这里找不到我的答案,尽管有类似的问题 - 大多数都与asp.net控件上的javascript调用有关。这不是那个。

我试图根据绑定到转发器的数据源的值为转发器中的复选框提供id。

我对使用非asp.net控件的元素没有任何问题,但是当它提供一个复选框时,如下例所示我得到了错误

  

创建控件时出错 - rptPayments

     

服务器标签格式不正确。

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

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

我已经看到有很多问题出现在类似的问题上,但通常是javascript \ OnClientClick(..)函数告诉人们使用单引号。

如果我尝试单引号,我会收到新的错误

  

控件的ID属性只能使用标记中的ID属性和简单值来设置。示例

我需要这个作为服务器端控件,以便我可以循环浏览所有复选框,点击按钮以查看哪些记录已经过验证,但需要将其与contactId链接

1 个答案:

答案 0 :(得分:3)

我认为您的批量更新按钮位于转发器之外。在这种情况下,您将让您循环遍历转发器项目并按以下步骤继续: -

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. 
}