如何使用runat =" server"在HTML表格行中嵌套转发器

时间:2014-11-25 20:37:46

标签: .net webforms

在.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仅在服务器端工作,因为它没有呈现。

2 个答案:

答案 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>