Избегайте перезагрузки всех данных XML для каждого ретранслятора - VB.NET

StackOverflow https://stackoverflow.com/questions/4803128

Вопрос

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

Вот мой код - я бы хотел сохранить все в коде, если это возможно.

<script runat="server">

Public doc As New XmlDocument()

Public Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs)

    If Not Page.IsPostBack then

        doc.Load(Server.MapPath("~/myxml/bookstore.xml"))

        Dim nodes As XmlNodeList = doc.SelectNodes("Bookings/Booking[@CLIENT_NO='SA33762']")
        rpMyRepeater.DataSource = nodes
        rpMyRepeater.DataBind()

    End If

End Sub

   Protected Sub itemDB(ByVal s As Object, ByVal e As RepeaterItemEventArgs)
      If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then

         Dim rpt As Repeater = CType(e.Item.FindControl("books"), Repeater)

         If Not (rpt Is Nothing) Then

            doc.Load(Server.MapPath("~/myxml/bookstore.xml"))

            Dim nodes2 As XmlNodeList = doc.SelectNodes("Bookings/Booking[@CLIENT_NO='SA33762']/Products/Book")

            rpt.DataSource = nodes2
            rpt.DataBind()

         End If

      End If
   End Sub

</script>

Любые идеи?

Это было полезно?

Решение

Я что -то здесь упускаю?

Разве вы не можете просто прокомментировать/удалить свой doc.load (server.mappath ("~/myxml/bookstore.xml"))) в вашем саб -emitdb? Поскольку вы определили документ «глобально» и уже загрузили его при загрузке страницы? (Сделав это, вы уже избежите перезагрузки XML)

Тем не менее, я согласен с Caspar, что вы предпочитаете использовать Xmldatasource (особенно для его способностей кэширования), вам не нужно использовать XmldataSource в рамках своей наценки - вы всегда можете определить его в своем коде -блудении - поскольку вы обеспокоены тем, что люди видят ваши (на основе сервера ASP.NET) Наценка по какой -то причине ...

например

Public Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) Handles Me.Load

    If Not Page.IsPostBack Then
        Dim source As New XmlDataSource()
        source.DataFile = "~/myxml/bookstore.xml"
        source.XPath = "Bookings/Booking[@CLIENT_NO='SA33762']"
        rpMyRepeater.DataSource = source
        rpMyRepeater.DataBind()
    End If

End Sub

Разметка:(Хорошая вещь, которую вы заметите здесь, это то, что мы связываем второй повторитель, используя источник из первого повторителя)

<asp:Repeater ID="rpMyRepeater" runat="server">
    <ItemTemplate>
        <%#XPath("//Booking/NAME/text()")%>
        <asp:Repeater runat="server" ID='books' DataSource='<%#XPathSelect("//Booking/Products/Book") %>'>
            <HeaderTemplate>
                <h2>
                    Books</h2>
            </HeaderTemplate>
            <ItemTemplate>
                <p>
                    Title:
                    <%#XPath("TITLE/text()")%></p>
                <p>
                    <%#XPath("BOOKCODE/text()")%></p>
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

XML

<?xml version="1.0" encoding="utf-8" ?>
<Bookings>
  <Booking CLIENT_NO="SA33762">
    <NAME>Mr Pf_Test_15033</NAME>
    <Products>
      <Book>
        <TITLE>My Book</TITLE>
        <BOOKCODE>12345</BOOKCODE>
      </Book>
      <Book>
        <TITLE>My Book2</TITLE>
        <BOOKCODE>123456</BOOKCODE>
      </Book>
    </Products>
  </Booking>
</Bookings>

Реализация с использованием управления ListView (Один из моих любимых элементов управления ASP.NET) будет выглядеть примерно так:(Если нет доступных книг, это отобразит разметку в пустотедатататере)

<asp:Repeater ID="rpMyRepeater" runat="server">
    <ItemTemplate>
        <%#XPath("//Booking/NAME/text()")%>
        <asp:ListView runat="server" ID="books" ItemPlaceholderID="phItems" DataSource='<%#XPathSelect("//Booking/Products/Book") %>'>
            <LayoutTemplate>
                <h2>
                    Books</h2>
                <asp:PlaceHolder runat="server" ID="phItems"></asp:PlaceHolder>
            </LayoutTemplate>
            <ItemTemplate>
                <p>
                    Title:
                    <%#XPath("TITLE/text()")%></p>
                <p>
                    <%#XPath("BOOKCODE/text()")%></p>
            </ItemTemplate>
            <EmptyDataTemplate>
                <p>
                    Sorry no books available</p>
            </EmptyDataTemplate>
        </asp:ListView>
    </ItemTemplate>
</asp:Repeater>

Другие советы

Использовать Xmldatasource Вместо пользовательского кода, лучше протестирован, настроенный, оптимизированный и соответствует вашим требованиям. Зачем писать что -то, что уже находится в рамках? ;)

 <asp:xmldatasource
    CacheDuration="Infinite"
    id="XmlDataSource1"
    runat="server"
    XPath="Bookings/Booking[@CLIENT_NO='SA33762']" //<-- test this
    datafile="~/myxml/bookstore.xml" />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top