如何在ASP.NET Repeater同一项的另一<td>中访问<td>内的Label?
解决ASP.NET Repeater中无法访问Label控件的问题
嘿,我明白你遇到的困扰了!在Repeater的ItemTemplate里直接用<% %>代码块访问Label1是行不通的——这些代码块是在页面解析阶段执行的,而Repeater里的服务器控件(比如Label1)要等到Repeater绑定数据之后才会被实例化,所以此时Label1还不存在,自然会报错。
其实不用绕弯子去访问Label,我们直接用数据源里的strRoles字段做判断就可以了,毕竟Label的Text也是从这个字段来的。
修改后的代码(前端直接处理)
<asp:Repeater runat="server" ID="Repeater1"> <ItemTemplate> <tr role="row" class="odd"> <td> <asp:Label ID="Label1" runat="server" Text='<%# Eval("strRoles") %>'></asp:Label> </td> <td> <% // 直接从数据源获取角色值,同时处理空值避免空引用报错 var currentRole = Eval("strRoles")?.ToString(); if (!string.IsNullOrEmpty(currentRole) && currentRole == "Creator") { %> <a href="#modal-danger" data-toggle="modal" onclick='<%# Eval("intProjectId", "saveID(\"{0}\")")%>' title="Delete"> <i class="fa fa-trash" style="font-size: 24px; color: #9c9798;"></i> </a> <% } %> </td> </tr> </ItemTemplate> </asp:Repeater>
补充:后台事件处理方式(适合复杂逻辑)
如果你的判断逻辑比较复杂,或者需要和其他服务器控件交互,也可以用Repeater的ItemDataBound事件来处理:
- 先给存放删除按钮的
<td>加上服务器端标识:
<td runat="server" ID="tdDeleteContainer"> </td>
- 后台代码添加事件处理:
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { // 只处理数据项,跳过表头、脚注等 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { // 从当前数据项中获取角色和项目ID string role = DataBinder.Eval(e.Item.DataItem, "strRoles").ToString(); string projectId = DataBinder.Eval(e.Item.DataItem, "intProjectId").ToString(); // 找到存放按钮的容器 HtmlTableCell deleteContainer = (HtmlTableCell)e.Item.FindControl("tdDeleteContainer"); if (role == "Creator") { // 动态生成删除按钮的HTML deleteContainer.InnerHtml = $@"<a href='#modal-danger' data-toggle='modal' onclick='saveID(""{projectId}"")' title='Delete'> <i class='fa fa-trash' style='font-size: 24px; color: #9c9798;'></i> </a>"; } else { // 隐藏容器或者清空内容 deleteContainer.Visible = false; } } }
最后别忘了给Repeater加上事件绑定属性:OnItemDataBound="Repeater1_ItemDataBound"
内容的提问来源于stack exchange,提问作者Boney Jose
相关产品推荐
相关产品推荐

