Как условно фильтровать XmlDataSource ретранслятора на основе значения родителей - PullRequest
0 голосов
/ 14 сентября 2011

Я пытаюсь создать навигацию по меню страницы сведений о продукте и хочу отображать элементы навигации только для продуктов той же категории.

Данные хранятся в двух разных файлах XML. Один, содержащий данные о текущем продукте, и другой, содержащий навигационную информацию. Оба содержат «категорию» как элемент.

Я хотел бы использовать другой XmlDataSource, а затем передать текущую категорию продуктов из родительского контейнера, доступного с помощью XPath («категория»), в атрибут 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 голосов
/ 16 сентября 2011

Решил мой собственный вопрос.

В итоге я использовал код, лежащий в основе подхода ItemDataBound, следующим образом:

asp code ;

<%-- 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 были немного неясными.

Код, представленный выше, работает для меня.

0 голосов
/ 14 сентября 2011

Лично я бы загрузил XML в DataSet и определил бы Relation s для сопоставления Родителя и Ребенка.

См. здесь для общего подхода.

...