Принудительно выполнять полную обратную передачу из UpdatePanel - PullRequest
6 голосов
/ 31 октября 2011

У меня есть GridView в панели обновления.Это унаследованный asp: GridView, поэтому у него есть небольшая иконка «экспортировать меня», которая делает именно это.Он работает, отвечая на «экспорт» щелчком файла XLS.Проблема в том, что если вы поместите интеллектуальный GridView в панель обновления, ASP.NET думает, что файл XLS должен быть записан в панель, что явно не то, что мы хотим.Для этого мне нужен полный постбэк каждый раз.

Все мои панели обновлений программно генерируются

Решения, которые не работают в этом точном сценарии (многие из которых описаны в других разделах).SO):

  1. В ASP.NET до версии 4, если вы не указали идентификатор элемента управления, он будет выполнять полную обратную передачу даже из панели обновления.Мой вопрос касается только самой последней и лучшей версии .NET 4.

  2. ScriptManager.RegisterPostBackControl выглядит многообещающе.Он заставляет контрольный постбэк использовать правильный идентификатор панели в качестве целевой цели, но в остальном не помогает.

  3. Добавление PostBackTrigger на панель обновлений.Мои панели обновления создаются программно, и MS заявляет, что это не поддерживается.Мои тесты показывают, что они правы: я пробовал это каждый раз, но это не работает.

  4. Мне не очень нравится идея, что умный GridView вырвется изсам, но я попытался сделать это поставить дополнительный элемент управления за пределами панели обновления в этих обстоятельствах.Идея заключается в том, чтобы клиентский javascript перенаправлял клиентский клик по моей кнопке экспорта внутри панели, чтобы имитировать щелчок по этой кнопке вне панели.Однако это не работает, потому что я, очевидно, не могу добавить «внешний» элемент управления на страницу - я получаю «Коллекция элементов управления не может быть изменена на этапах DataBind, Init, Load, PreRender или Unload».ошибка.

  5. Использование jQuery для перемещения элемента управления «экспорт» за пределы панели.У MS должен быть какой-то список элементов управления, которые, по их мнению, находятся «на» панели, и физическое расположение в DOM не имеет значения.

У кого-нибудь есть идеи, как это сделать?Работа?Я знаю, что многое из этого должно работать, но это не совсем то же самое.

Ответы [ 4 ]

4 голосов
/ 31 октября 2011

Для меня решение 3 работает.

Я динамически добавляю UpdatePanel на страницу, добавляю Button к шаблону контента и связываю PostBackTrigger.Я добавил обработчик событий Click, в котором я обновляю метку (за пределами UpdatePanel) с текущей датой / временем.

См. Мои настройки теста ниже.Разметка

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:Panel ID="Panel1" runat="server"></asp:Panel>
<asp:Label ID="Label1" runat="server"></asp:Label>

Код позади

protected void Page_Load(object sender, EventArgs e)
{
    string buttonId = "Button1";

    UpdatePanel updatePanel = new UpdatePanel();
    updatePanel.ID = "UpdatePanel1";

    Button button = new Button();
    button.ID = "Button1";
    button.Text = "Post back";
    button.Click += new EventHandler(button_Click);

    updatePanel.Triggers.Add(new PostBackTrigger() { ControlID = buttonId});

    updatePanel.ContentTemplateContainer.Controls.Add(button);

    Panel1.Controls.Add(updatePanel);
}

void button_Click(object sender, EventArgs e)
{
    Label1.Text = string.Format("Current date/time: {0}", DateTime.Now.ToString());
}

Надеюсь, это поможет.

3 голосов
/ 27 сентября 2013

Я понимаю, что об этом спрашивали год назад, но если это кому-нибудь поможет, решение 2 сработало для меня.

((ScriptManager)this.Page.Master.FindControl("scrptmgr")).RegisterPostBackControl(lnkbtn);

Единственный способ заставить его работать, это если контроль (в данном случаеlnkbtn) отображается, когда запускается приведенная выше строка кода.

Edit - После дополнительного тестирования теперь кажется, что этот метод работает, только если между регистрацией элемента управления нет никаких обратных передач для регистрации элемента управления.полный постбэк и собственно нажатие на вещь.Решение или взлом состоит в том, чтобы зарегистрировать элемент управления для полной обратной передачи при каждой загрузке страницы.

0 голосов
/ 22 мая 2016

В случае, если элемент управления, который должен форсировать обратную передачу страницы (предположим, кнопку), --inside-- поле шаблона GridView, у вас могут возникнуть некоторые проблемы при установке controlId для триггера UpdatePanel ... в этом случае вы можете просто перейти для кнопки teemplatefield и установите для ее свойства PostBackUrl значение ... той же самой страницы!

Таким образом, щелкнув по нему, вы получите полный постбэк ...

0 голосов
/ 04 июля 2013

Я создал аналогичный унаследованный элемент управления GridView с возможностью экспорта в CSV.То, как я это обработал, - сделать кнопку экспорта простым <a href> на текущей странице со специально созданным параметром строки запроса "?SortablePagableGridViewExportToCSV=XXX", где XXX - это UniqueID моего элемента управления.Я переопределяю метод Render моего элемента управления, и там я проверяю параметры запроса вручную, чтобы увидеть, был ли отправлен этот параметр экспорта.Если это так, я пишу заголовок и ответ типа контента CSV, как показано ниже.

Me.Page.Response.Clear()
Me.Page.Response.ClearContent()
Me.Page.Response.ClearHeaders()
Me.Page.Response.ContentType = "text/csv"
Me.Page.Response.AddHeader("Content-Disposition", "attachment;filename=" & Me.ExportToCsvFileName)
Me.Page.Response.End()

Ключ - это вызов Page.Response.End(), который останавливает всю дальнейшую обработку.Это запрос GET, поэтому мне не нужно беспокоиться об асинхронных обратных передачах UpdatePanel или о чем-либо подобном.Браузер ведет себя прекрасно в этой ситуации, выскакивает ссылку на скачивание, но держит пользователя на текущей странице.URL-адрес браузера не изменяется, и пользователь может даже щелкнуть правой кнопкой мыши ссылку для загрузки и использовать «Сохранить объект как ...», если он этого желает.

...