Избегайте перезагрузки всех данных XML для каждого ретранслятора - VB.NET
-
24-10-2019 - |
Вопрос
Я пытаюсь разместить ретранслятор в ретранслятор, используя данные 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" />