在母版页内的无序列表中查找转发器?

时间:2013-08-07 12:45:07

标签: asp.net master-pages

我已将html模板加载到我的母版页中,然后将类别绑定到数据库。 我用过这个编码。

<ul class="categories">
            <li id="categoryItem">
                <h4>Categories</h4>
                <ul class="categories"  id="categorylist">            
                    <asp:Repeater ID="repCategories" runat="server">
                        <HeaderTemplate><ul></HeaderTemplate>
                        <ItemTemplate>
                            <li>
                            <asp:HyperLink ID="hyperCategories" runat="server"><%#Eval("CategoryName")%></asp:HyperLink>
                            </li>
                        </ItemTemplate>
                        <FooterTemplate></ul></FooterTemplate>
                    </asp:Repeater>
                </ul>
            </li>

并尝试通过在master.cs页面上进行编码将此转发器绑定到我的数据库。

 if (!IsPostBack)
        {
            DataSet ds = new ViewAction().GetAllProductCategoryData();
            repCategories.DataSource = ds;
            repCategories.DataBind();
        }

但它显示错误

"The name repCategories does not exist in the current context"

为什么显示此错误有助于我解决此问题。请

1 个答案:

答案 0 :(得分:2)

你的代码(写入)不起作用的原因是因为Repeater嵌套在另外两个服务器控件中:

  • <li runat="server">
  • <ul class="categories" runat="server" id="categorylist">

这意味着Repeater与顶级元素位于不同的“命名容器”中,并且无法直接从您的母版页的代码隐藏文件访问。

要解决此问题,您需要

  1. 从这些控件中删除runat="server"(如果您实际上不需要从服务器端代码访问它们)。这将允许您的代码以现在的方式工作。的 或者,
  2. <li>元素添加ID,然后使用FindControl方法访问嵌套的Repeater。
  3. 选项二看起来像这样(我们假设您给<li> ID为“categoryItem”):

    if (!IsPostBack)
    {
        // Get the Repeater from nested controls first
        Repeater repCategories = (Repeater)categoryItem.FindControl("categorylist").FindControl("repCategories");
        // Do the rest of your work
        DataSet ds = new ViewAction().GetAllProductCategoryData();
        repCategories.DataSource = ds;
        repCategories.DataBind();
    }
    

    您需要使用该代码在需要在代码隐藏中访问它的任何地方“获取”Repeater。