【发布时间】:2011-10-05 20:20:25
【问题描述】:
TL;DR
Repeater 中的控件需要特殊实例化才能有用。当每个控件由中继器构造时,如何为它们执行这种特殊的实例化?
设置
我有三个班级:
复杂数据。
包含许多不同类型的公共成员,例如:
- int favorite_integer
- 食物what_you_had_for_breakfast_this_morning
- 字符串 capital_of_alaska
- PhaseOfMoon when_magic_runes_will_reveal_themselves_on_the_mysterious_artifact
等等等等等等
复杂数据显示
用于以美观的方式呈现 ComplexData 实例的控件。公开单个公共成员 ComplexMember DataToDisplay。当用户设置 DataToDisplay 时,控件中的标签会自动填充适当的数据。
MultiComplexDataDisplay
使用Repeater 在一行中显示多个ComplexDataDisplay 的控件。它包含一个private List<ComplexData> datasToDisplay,它是转发器的数据源。它提供了两个公共方法,addComplexData(ComplexData) 和emptyAllData(),让用户可以操作 datasToDisplay。
问题
数据绑定过程中,不知道如何设置每个ComplexDataDisplay的DataToDisplay成员。
似乎转发器中的控件通常是从前端填充的,例如
<asp:Repeater runat="server" id="linkRepeater">
<a href="<%# getUrl(Container.DataItem) %>"> <%# getDescription(Container.DataItem) %> </a>
</asp:Repeater>
据我了解,在数据绑定期间,转发器实例化每个锚元素,使用任何数据源来设置 href 和描述。
我复制这种行为的尝试只导致了一个空白页:
<asp:Repeater runat="server" id="displayRepeater">
<ComplexDataDisplay id="dataDisplay" DataToDisplay="<%# Container.DataItem %>" runat="server"
</asp:Repeater>
我能想到的唯一另一件事是修改 ComplexDataDisplay,使其对 ComplexData 的每个成员都有一个公共成员。然后在中继器内我可以做:
<asp:Repeater runat="server" id="displayRepeater">
<ComplexDataDisplay id="dataDisplay" runat="server"
favorite_integer="<%# get_favorite_integer(Container.DataItem) %>"
what_you_had_for_breakfast_this_morning="<# get_what_you_had_for_breakfast_this_morning(Container.DataItem) %>"
<%--etc etc etc--%>
/>
</asp:Repeater>
这似乎非常不受欢迎,因为对于 ComplexData 的每个成员,我必须在 ComplexDataDisplay 中编写一个相应的公共成员,并在 MultiComplexDataDisplay 中编写一个get_whatever(DataItem) 方法。最重要的是,我什至不知道它是否会起作用,因为 ComplexData 的一半成员是复杂数据类型,可能会或可能不会以这种方式设置。
我在寻找什么答案
以下之一:
- 直接回答 TLDR 部分中提出的问题 - 一种在数据绑定期间为中继器中的每个控件执行特殊实例化的方法,或者一种在事后不久对其进行迭代的方法。
- 关于如何最好地重构代码的建议,以便不再需要特殊的实例化来显示我的许多复杂数据。我愿意添加/更新/删除除 ComplexData 之外的任何类,因为我有义务按原样维护其接口。
- 与我的问题相关的最佳实践/参考/文档,它们将指导我自己寻找解决方案。
【问题讨论】: