使用ASP.net 2.0,我如何向用户显示信息,类似于SO上的“问题”列表,其中每个问题都有一些子项(例如标签)。
我可能会进行两个单独的查询,一个首先查找问题列表,然后另一个查询查找属于问题列表的所有标签。
方法1:
然后,我可能会使用嵌套的转发器,并在每个嵌套的转发器“ OnItemDataBind”上的代码后面执行一条select语句。
方法二:
或使用这两个数据集,我将使用C#代码创建每个“问题”的业务实体,并具有一个称为“标签”的属性。然后,我将遍历标签数据集并分配属性。
有什么更有效的?还有其他选择吗?
我肯定会避免第二种方法- 您不想每次对父项进行数据绑定时都访问数据库。正如DOK所说,请尝试正确地构建您的系统。对我而言,这意味着填充业务对象的集合并对其进行绑定。我对自定义菜单控件做了类似的操作(请注意,这嵌套了三个数据列表,但是您可以使用转发器):
在aspx页面中:
<asp:DataList ID="dlMenuOne" runat="server" onitemdatabound="dlMenu_ItemDataBound" > <ItemTemplate> //your object <asp:DataList ID="dlMenuTwo" runat="server" onitemdatabound="dlMenuTwo_ItemDataBound"> <ItemTemplate> //your object's child items <asp:DataList ID="dlMenuThree" runat="server"> <ItemTemplate> //child item's child items </ItemTemplate> </asp:DataList> </ItemTemplate> </asp:DataList> </ItemTemplate> </asp:DataList>
然后在后面的代码中:
protected void dlMenu_ItemDataBound(object sender, DataListItemEventArgs e) { DataListItem parentList = e.Item; DataList dlMenuTwo = (DataList)parentList.FindControl("dlMenuTwo"); MenuItem item = (MenuItem)parentList.DataItem; dlMenuTwo.DataSource = _menu.GetChildItems(item); dlMenuTwo.DataBind(); }
此方法基本上获取对要绑定的对象的引用(parentList.DataItem),然后将嵌套的DataList绑定到子项(_menu.GetChildItems(item))