【问题标题】:asp.net repeater "the server tag is not well formed"asp.net 转发器“服务器标签格式不正确”
【发布时间】:2016-01-18 09:40:38
【问题描述】:

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

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

我对不是 asp.net 控件的元素没有任何问题,但是当像下面的示例那样向复选框提供它时,我得到了错误

创建控件时出错 - rptPayments

服务器标签格式不正确。

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

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

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

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

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

我需要它作为服务器端控件,以便我可以在单击按钮时循环遍历所有复选框以查看哪些记录已被验证,但需要将其与 contactId 链接

【问题讨论】:

  • 服务器控件无法做到这一点。一旦你添加了runat 属性,控件就变成了一个服务器控件,你不能动态地改变它的ID。你为什么要首先这样做?
  • 我有一个包含大约 50 笔付款的数据集,在付款之前需要对其进行验证,并相应地更新数据库。选中复选框并按下批量更新按钮后,后面的代码将通过每个复选框查找付款 ID,然后相应地更新记录。如果通过命名 id 无法以这种方式实现,我不妨放弃转发器,然后在页面加载时一直构建它。
  • No Wait wait :) 无法通过这种方式更改 ID,但您显然可以检查它们是否被选中,然后继续。不要丢弃控件本身。
  • 那我应该怎么做才最好呢?因为我不想通过request.form(...)查看

标签: asp.net .net repeater


【解决方案1】:

我假设您的批量更新按钮位于中继器之外。在这种情况下,您将让您遍历中继器项目并像这样继续:-

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

【讨论】:

  • 这与我要检查控件是否被检查的方式类似,但是仍然没有给我contactId的ID以将其绑定到正确的帐户
  • @SimonPrice - 为什么你对复选框的Id 感兴趣?您应该将该记录的 id 存储在某个隐藏控件中,并在选中该复选框时从隐藏控件中读取值。
  • 如果我有一个 id 为 cb_repeater1_0 的复选框,那么它将如何绑定到记录 123454。我在复选框 id 中使用记录的 id 以确保我正在验证正确的信息。
  • @SimonPrice - 是的,但您必须将 id 存储在某个地方,对吗?只需使用隐藏字段控件。请检查我的更新。
  • @SimonPrice - 很高兴它帮助了你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2012-12-14
相关资源
最近更新 更多