在.NET Web表单中,我有一个非常复杂的用户控件。此控件中的一个功能是表格。使用JavaScript,我需要能够动态隐藏/显示此表中的行。我还需要能够在.NET中设置页面加载的行可见性。所以我试图在表行中添加runat="server"
标记,并为其提供一个ID以满足这两个要求。
然而,当我这样做时,它会破坏转发器中的模型绑定 - Item is not declared. It may be inaccessible due to its protection level
<table>
<tbody>
<tr></tr> <!-- Ignore, I have extra rows here that I need to be able to show/hide as well -->
<tr></tr>
<tr runat="server" ID="testID">
<td runat="server" ID="incrementalSalesCell">
<asp:Label runat="server" ID="lblTotalIncrementalSalesTitle" Text="Incremental Sales"></asp:Label>
</td>
<asp:Repeater runat="server" ID="rptGlobalIncrementalSales" ItemType="GlobalSalesControl">
<ItemTemplate>
<td runat="server"><asp:Label runat="server" ID="lblIncrementalSalesYear1" Text='<%#Item.IncrementalSalesYear1%>'></asp:Label></td>
<td runat="server"><asp:Label runat="server" ID="lblIncrementalSalesYear2" Text='<%#Item.IncrementalSalesYear2%>'></asp:Label></td>
<td runat="server"><asp:Label runat="server" ID="lblIncrementalSalesYear3" Text='<%#Item.IncrementalSalesYear3%>'></asp:Label></td>
</ItemTemplate>
</asp:Repeater>
</tr>
</tbody>
</table>
我已成功使用PlaceHolder
控件服务器端,但很明显PlaceHolder仅在服务器端工作,因为它没有呈现。
答案 0 :(得分:0)
尝试:
<table>
<tbody>
<tr></tr> <!-- Ignore, I have extra rows here that I need to be able to show/hide as well -->
<tr></tr>
<tr runat="server" ID="testID">
<td runat="server" ID="incrementalSalesCell">
<asp:Label runat="server" ID="lblTotalIncrementalSalesTitle" Text="Incremental Sales"></asp:Label>
</td>
<asp:Repeater runat="server" ID="rptGlobalIncrementalSales" ItemType="GlobalSalesControl">
<ItemTemplate>
<td runat="server"><asp:Label runat="server" Text='<%= getYear(1);%>'></asp:Label></td>
<td runat="server"><asp:Label runat="server" Text='<%= getYear(2);%>'></asp:Label></td>
<td runat="server"><asp:Label runat="server" Text='<%= getYear(3);%>'></asp:Label></td>
</ItemTemplate>
</asp:Repeater>
</tr>
</tbody>
然后,在后面的代码中:
protected string getYear(int number)
{
switch (number)
{
case 1:
return X;
case 2:
return Y;
case 3:
return Z;
default:
return W;
}
}
在页面加载中,计算要返回的值(全局变量X,Y,Z和W)到getYear函数。
答案 1 :(得分:0)
我遇到了同样的问题。将runat =“ server”添加到tr标记会破坏中继器。
有几种不同的方法可以解决此问题。您可以使用Javascript和CSS在客户端将其隐藏。
如果要在服务器端(在Page_Load上)执行此操作,则不要隐藏行本身,而是隐藏其内容。这是一个想法,但是有效。
如果您使用的表中的行具有不同的颜色,例如Bootstrap'table-striped'类,那么当内容隐藏时,您将得到两个彼此相邻的相同颜色的行,因为该行没有高度,但仍然存在。要解决此问题,请添加一个空行,然后在隐藏其他内容时显示该行,反之亦然。
<table>
<tbody>
<tr>
<td runat="server" ID="tdId" Visible='<%# RowIsVisible() %>'>
<asp:Label runat="server" ID="lblWhatever" Text="Whatever"></asp:Label>
</td>
<asp:Repeater runat="server" ID="rptId" Visible='<%# RowIsVisible() %>'>
<ItemTemplate>
...
</ItemTemplate>
</asp:Repeater>
</tr>
<tr runat="server" id="trStripeFixer" Visible='<%# !RowIsVisible() %>'></tr>
</tbody>
</table>