我正在尝试构建产品详细信息页面菜单导航,并且只想显示属于同一类别的产品的导航项目。
数据保存在两个不同的XML文件中。 一个包含当前产品数据,另一个包含导航信息。 两者都包含“category”作为元素。
我想使用另一个XmlDataSource,然后从父容器传递当前产品类别,可以使用XPath(“category”)访问XPath属性以过滤值。
然后我会将此过滤后的数据源传递给转发器进行渲染。
<%-- get the current product XML --%>
<asp:XmlDataSource ID="productDS" runat="server" XPath="/product" DataFile="~/App_Theme/project/products/poduct1.xml"/>
<asp:DataList ID="product" DataSourceID="productDS" runat="server">
<ItemTemplate>
<%--
get the navigation XML and filter the nodes to only show the navItems with the current product category
--%>
<asp:XmlDataSource ID="navItemsDS" runat="server" XPath="/navigation/navItems/navItem[category='<%# XPath("category") %>']" DataFile="~/App_Theme/project/productslist.xml"/>
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="navItemsDS" >
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li><a href="productdetail.html?page=products&id=<%# XPath("prodctid") %>"><%# XPath("producttitle") %></a></li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
... etc
然而,这不起作用。
如何在.NET 2.0中实现这一目标。
答案 0 :(得分:0)
就个人而言,我将XML加载到DataSet
并定义Relation
以将Parent映射到Child。
有关一般方法,请参阅here。
答案 1 :(得分:0)
解决了我自己的问题。
我最终使用了ItemDataBound
方法背后的代码,如下所示;
asp代码;
<%-- get the current product XML --%>
<asp:XmlDataSource ID="productDS" runat="server" XPath="/product" DataFile="~/App_Theme/project/products/poduct1.xml"/>
<asp:DataList ID="product" DataSourceID="productDS" runat="server">
<ItemTemplate>
<%--
get the navigation XML and filter the nodes to only show the navItems with the current product category
--%>
<asp:XmlDataSource ID="navItemsDS" runat="server" XPath="/navigation/navItems/navItem" DataFile="~/App_Theme/project/productslist.xml"/>
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="navItemsDS" OnItemDataBound="navigation_ItemDataBound">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li><a href="productdetail.html?page=products&id=<%# XPath("prodctid") %>"><%# XPath("producttitle") %></a></li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
代码;
// hides navigation items that are not in the same category as this product.
public void navigation_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
// get a navigator for the current navigation item xml
XPathNavigator nav = ((IXPathNavigable)e.Item.DataItem).CreateNavigator();
// get a navigator for the product xml
XPathNavigator nav2 =((IXPathNavigable)((DataListItem)e.Item.Parent.Parent).DataItem).CreateNavigator();
String itemCategory = nav.SelectSingleNode("category").Value;
String productCategory = nav2.SelectSingleNode("category").Value;
if (itemCategory != productCategory)
{
e.Item.Visible = false;
}
}
查找DataList的数据项,即e.item.Parent.Parent.DataItem
最初很难解决。
然后获取实际的XML节点值有点模糊。
上面的代码对我有用。