.NET xmldatasource не показывает последние данные при обратной передаче - PullRequest
0 голосов
/ 14 июля 2011

Я столкнулся с проблемой, которую затрудняюсь понять и / или обойти.

Я работаю над страницей настроек, которая обновляет файл XML. На странице есть XmlDataSource с файлом преобразования (для фильтрации и сортировки значений) и DataList, который заполняется из XmlDataSource. Пользователь может ввести имя новой группы в текстовое поле и нажать кнопку, чтобы отправить форму. Когда это происходит, новое значение успешно добавляется в файл XML.

Итак, у меня простая ситуация: опубликовать форму и обновить источник данных. Конечно, я также хотел бы, чтобы DataList показывал новую добавленную стоимость, но мне, кажется, там не повезло. Новое значение не появляется сразу. Если я немедленно введу другое значение и отправлю форму, то значение, которое я ввел ранее, будет отображаться. По сути, я на шаг отстаю каждый раз при отправке формы.

Вот разметка:

<asp:DataList ID="list_groups" runat="server" DataSourceID="siteConfig_supportGroups"
 CellSpacing="0" EnableViewState="False">
<ItemTemplate>
    <div style="margin-bottom:12px;">            
        <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="~/Images/del.png"
         CommandArgument='<%#Eval("name") %>' style="float:left; margin-right:6px;" />
        &nbsp;<%#Eval("name")%>
    </div>
</ItemTemplate>
</asp:DataList>

New: <asp:TextBox ID="txt_new_group" runat="server"></asp:TextBox> 
<asp:Button ID="btn_new_group" runat="server" Text="Add" />

<asp:XmlDataSource ID="siteConfig_supportGroups" runat="server" 
 DataFile="~/presets.xml"  EnableViewState="False" EnableCaching="False" 
 TransformFile="supportGroups.xslt"></asp:XmlDataSource>  

И код, содержащийся в обработчике событий для нажатия кнопки:

Dim presets As New XmlDocument
presets.Load(Server.MapPath("presets.xml"))

Dim newNode As XmlNode = presets.CreateNode(XmlNodeType.Element, "group", Nothing)
Dim nodeName As XmlAttribute = presets.CreateAttribute("name")
nodeName.Value = txt_new_group.Text

newNode.Attributes.Append(nodeName)

Dim test As XmlNode = presets.SelectSingleNode("settings/supportGroups")
test.AppendChild(newNode)

presets.Save(Server.MapPath("presets.xml"))

Что касается жизненного цикла страницы и привязки данных, я не знаю никаких проблем с этой настройкой. Насколько я понимаю, привязка данных происходит во время или после события prerender, которое определенно происходит после кода выше. Это наводит меня на мысль, что с самим файлом xml может происходить что-то необычное. Возможно, он прочитан элементом управления XmlDataSource до того, как мой код сможет обновить и сохранить его?

Большая часть поисков, о которых я говорил, упоминается с помощью метода getXmlDocument () XmlDataSource, который возвращает xmlDocument, который можно редактировать и сохранять с помощью метода save () XmlDataSource. Однако я получаю сообщение об ошибке, в котором говорится, что метод сохранения не может быть использован, пока указан файл преобразования. Мне нужен файл преобразования, чтобы отсортировать параметры для пользователя. Все остальное упоминает атрибуты enableviewstate и enablecaching, которые также не решают проблему.

Буду весьма признателен за любые идеи или предложения по обходному пути.

1 Ответ

0 голосов
/ 15 июля 2011

Я изменил несколько вещей, которые заставили страницу работать.

Прежде всего, проблемы с обновлением данных исчезли, когда я вынул ImageButton из шаблона DataList. Я понятия не имею, почему это имело значение, но это сделало.

В качестве альтернативы я попытался использовать Repeater, который включал ImageButton в шаблон и ViewState отключен. Это сработало - данные обновлялись всякий раз, когда добавлялось новое значение. Однако мне пришлось снова включить ViewState, чтобы сервер перехватил событие ItemCommand. Это снова выводит данные из синхронизации. Чтобы исправить это, я добавил операцию привязки данных сразу после обновления XML-файла.

Теперь все работает! Когда добавляется новое значение, повторитель показывает новое значение, а когда нажимается кнопка изображения, сервер регистрирует событие ItemCommand. Лучше всего, мне не пришлось возиться с XmlDataSource и файлом преобразования, который я настроил.

Окончательная разметка:

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="siteConfig_supportGroups">
<ItemTemplate>
<div style="margin-bottom:12px;">
    <asp:ImageButton ID="ImageButton1" ImageUrl="~/Images/del.png" runat="server" 
     CommandArgument='<%#Eval("name") %>' />
    &nbsp;<%#Eval("name")%>
    </div>
</ItemTemplate>
</asp:Repeater>

New: <asp:TextBox ID="txt_new_group" runat="server"></asp:TextBox> 
<asp:Button ID="btn_new_group" runat="server" Text="Add" />

<asp:XmlDataSource ID="siteConfig_supportGroups" runat="server"
 DataFile="~/presets.xml"  EnableViewState="False" EnableCaching="False"
 TransformFile="~/supportGroups.xslt" ></asp:XmlDataSource>  

Финальный код:

Private Sub btn_new_group_Click(ByVal sender As Object, ByVal e As System.EventArgs) 
   Handles btn_new_group.Click
    Dim presets As New XmlDocument
    presets.Load(Server.MapPath("presets.xml"))

    Dim newNode As XmlNode = presets.CreateNode(XmlNodeType.Element, "group", Nothing)
    Dim nodeName As XmlAttribute = presets.CreateAttribute("name")
    nodeName.Value = txt_new_group.Text

    newNode.Attributes.Append(nodeName)

    Dim test As XmlNode = presets.SelectSingleNode("settings/supportGroups")
    test.AppendChild(newNode)

    presets.Save(Server.MapPath("presets.xml"))

    Repeater1.DataBind()
    txt_new_group.Text = ""
End Sub

Private Sub Repeater1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.RepeaterCommandEventArgs) 
   Handles Repeater1.ItemCommand
    Dim test = "Hey!"
End Sub
...