0

商品詳細ページのメニュー ナビゲーションを構築しようとしていますが、同じカテゴリにある商品のナビゲーション アイテムのみを表示したいと考えています。

データは 2 つの異なる XML ファイルで維持されます。1 つは現在の製品データを含み、もう 1 つはナビゲーション情報を含みます。どちらも「カテゴリ」を要素として含んでいます。

別の 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 でこれを実現するにはどうすればよいですか。

4

2 に答える 2

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 ノードの値を取得するのは少しわかりにくかったです。

上記のコードは私にとってはうまくいきます。

于 2011-09-16T11:21:18.363 に答える
0

Personally, I'd load the XML into a DataSet and define Relations to map Parent to Child.

See here for general approach.

于 2011-09-14T16:46:02.333 に答える