Отменить кросс-страничный постбэк? - PullRequest
4 голосов
/ 17 декабря 2010

У меня есть страница, на которой есть несколько ListBox с каскадной фильтрацией на основе выбранных значений с использованием AutoPostBack. Форма принимает все выбранные значения и генерирует документ Excel путем публикации на нескольких страницах в другом ASPX. Проблема в том, что после однократного нажатия кнопки «Отправить» он будет постоянно запускать постбэк при каждом изменении выбора.

<asp:ScriptManager runat="server" />
<asp:UpdatePanel UpdateMode="Conditional" runat="server">
    <ContentTemplate>
  <asp:ListBox ID="ParentItems" runat="server" SelectionMode="Multiple" AutoPostBack="true"></asp:ListBox>    
  <asp:ListBox ID="ChildItems" runat="server" SelectionMode="Multiple" AutoPostBack="true"></asp:ListBox>  
 </ContentTemplate>
</asp:UpdatePanel>

<asp:Button ID="Submit" runat="server" PostBackUrl="~/AnotherPageThatGeneratesAnExcelDoc.aspx" />

Как отменить постбэк-постбэк из событий ListBox es 'SelectedIndexChanged?

Вот событие в коде:

Protected Sub ParentItems_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ParentItems.SelectedIndexChanged
 '' do some filtering of the ChildItems ListBox

 '' tried these but they do not work
 ''Submit.Enabled = False

 ''Submit.PostBackUrl = String.Empty

 '' I also tried wrapping the button in a PlaceHolder and hiding/removing it, neither worked
 ''Buttons.Visible = False
 ''Buttons.Controls.Remove(Submit)
End Sub

Ответы [ 2 ]

1 голос
/ 17 декабря 2010

Это мое текущее решение с использованием JavaScript. Это работает, но похоже на взлом:

// using jQuery, add a click event that resets the form action
$("select[multiple]").click(function () {
    this.form.action = this.form._initialAction;
});

Редактировать: добавление события щелчка в коде:

ParentItems.Attributes("onclick") = "this.form.action = this.form._initialAction;"
0 голосов
/ 17 декабря 2010

Проблема заключается в том, что при использовании свойства PostbackUrl действие формы сбрасывается на новый URL, а ваши Ajax-вызовы (или любые последующие обратные передачи) используют любое текущее действие формы.

Ваше решение не 'Это не работает, потому что кнопка отправки не является частью вашей UpdatePanel, поэтому она никогда не изменяется.

Самое простое решение может состоять в том, чтобы переместить ваш файл Excel, генерирующий код, со страницы, на которой он находится, и на страницу, на которой вы работаете.смотрите в обработчике нажатия кнопки.

Возможно, вы также можете включить iframe на страницу, которую вы просматриваете, и при отправке, вместо перехода на новую страницу, установить источникiframe на страницу, генерирующую Excel.

Оба из них позволят избежать использования PostbackUrl.

...