在用户控件中引用父重复控件的DataItem

3

我需要将一个用户控件放置在重复器控件的模板中,并引用重复器数据源中的数据项。

我尝试了以下代码(忽略第二个转换,它是特定于我使用的CMS平台的):

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

但是这会抛出以下错误:无法将类型为“ASP.usercontrols_searchcontrols_searchresult_ascx”的对象强制转换为类型“System.Web.UI.WebControls.RepeaterItem”。
Searchresult_ascx是另一个包含实际重复器的用户控件。
3个回答

5
我会在用户控件上添加一个属性来保存容器,就像这样:
``` 我会在用户控件上添加一个属性来保存容器,就像这样: ```
<asp:repeater ... >
  <my:usercontrol containerdata='<%# Container.DataItem %>' ... />
</asp:repeater>

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

嗨,艾伦,我看到你注意到了EPiServer关键字。:) 顺便说一句,感谢你的精彩博客 - 你救了我几次。无论如何,我希望找到一个更通用的解决方案来解决这个问题。为了让你有点背景,我们创建了一个自定义模板重复控件,用于列出EPiServer页面。基本上,通过控件呈现的每个页面类型都使用自定义模板,以允许该页面类型的自定义属性按需呈现。 - Niluse
问题在于目前整个控件对于每个模板都是硬编码的。我正在尝试的是根据页面类型名称动态加载用户控件来呈现页面类型的数据,以避免在添加新页面类型时必须更改重复器类的代码。此外,使用没有任何代码后台的用户控件还可以消除编译和部署这些更改的需要。目前这是我在业余时间工作的一个项目,所以我有机会时将进一步探索选项并发布结果。 - Niluse
将自定义用户控件加载并附加到基于页面类型的重复器似乎非常简单。我可能会在代码后台(在页面上而不是用户控件上)执行此操作,以获得完全的控制和可测试性。 - Allan Thraen
这也解决了我的问题。由于某种原因,我不得不使用Eval("name")而不是DataBinder.Eval,但现在它可以工作了。谢谢! - Chris

0
我会在重复器中添加一个OnItemDataBound事件,然后从那里将适当的数据绑定到用户控件。

0

看起来你需要在层级结构中找到更多的父控件。我通常在调试模式下使用立即窗口来查找我需要回退的深度,或者在网页上使用Trace="True"并查看控件树以查看层次结构。从那里,你应该能够找出你的代码以获取正确的父控件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接