如何根据父值有条件地过滤转发器的XmlDataSource

时间:2011-09-14 16:41:05

标签: .net asp.net c#-2.0 itemdatabound

我正在尝试构建产品详细信息页面菜单导航,并且只想显示属于同一类别的产品的导航项目。

数据保存在两个不同的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&amp;id=<%# XPath("prodctid") %>"><%# XPath("producttitle") %></a></li>
        </ItemTemplate>
        <FooterTemplate>
            </ul>
        </FooterTemplate>
     </asp:Repeater>

     ... etc

然而,这不起作用。

如何在.NET 2.0中实现这一目标。

2 个答案:

答案 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&amp;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节点值有点模糊。

上面的代码对我有用。