【问题标题】:Referencing DataItem of parent Repeater control inside a User Control在用户控件中引用父Repeater控件的DataItem
【发布时间】:2009-09-02 18:19:00
【问题描述】:

我需要将用户控件放入转发器控件的模板中,并从转发器的数据源中引用数据项。

我试过了(忽略我使用的 CMS 平台特有的第二个演员表):

<%# ((EPiServer.Core.PageData)((RepeaterItem)Container.Parent.NamingContainer).DataItem)["PageName"]%>

但这会引发以下错误:无法将“ASP.usercontrols_searchcontrols_searchresult_ascx”类型的对象转换为“System.Web.UI.WebControls.RepeaterItem”

Searchresult_ascx 是另一个包含实际中继器的用户控件。

【问题讨论】:

    标签: c# asp.net user-controls repeater


    【解决方案1】:

    我会在用户控件上添加一个属性来保存容器 - 像这样:

    <asp:repeater ... >
      <my:usercontrol containerdata='<%# Container.DataItem %>' ... />
    </asp:repeater>
    

    当然,在用户控件内部,数据绑定到您传递的 PageData 项。

    【讨论】:

    • 嗨,Allan,我看到您对 EPiServer 关键字有所了解。 :) 虽然我有机会,但感谢精彩的博客——你救了我几次。无论如何,我希望有一个更通用的解决方案来解决这个问题。为了给您一些背景知识,我们创建了一个自定义的模板化转发器控件,用于列出 EPiServer 页面。基本上,通过控件呈现的每个页面类型都使用自定义模板来允许根据需要呈现该页面类型的自定义属性。
    • 问题是目前整个控件是为每个模板硬编码的。我正在尝试的是尝试根据页面类型名称动态加载用户控件以呈现页面类型的数据,以避免在添加新页面类型时必须对转发器类进行代码更改。此外,使用没有任何代码隐藏的用户控件也将消除编译和部署这些更改的需要。这是我目前正在做的事情,所以当我有机会时,我会进一步探索选项并发布结果。
    • 加载自定义用户控件并将其附加到基于页面类型的转发器上听起来相当简单。我可能会在代码隐藏中(在页面上,而不是用户控件上)这样做以获得完全的控制和可测试性。
    • 这也解决了我的问题。由于某种原因,我不得不使用 Eval("name") 而不是使用 DataBinder.Eval,但它现在可以工作了。谢谢!
    【解决方案2】:

    听起来你在层次结构中有更多的父级来获得所需的控制。我经常在调试模式下使用即时窗口来查找我必须退出的深度,或者使用网页上的 Trace="True" 并查看控制树以查看层次结构。从中你应该能够找出你的代码来获得正确的父控件。

    【讨论】:

      【解决方案3】:

      我会向转发器添加一个OnItemDataBound 事件,并从那里将适当的数据绑定到用户控件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-16
        • 2011-02-04
        • 1970-01-01
        • 2013-09-02
        • 1970-01-01
        • 2010-11-17
        • 1970-01-01
        相关资源
        最近更新 更多