ASP.NET обратная передача с помощью JavaScript
у меня есть несколько маленьких div
с использованием jQuery
перетаскивать. Эти div
s помещаются в UpdatePanel
, и на dragstop я использую _doPostBack()
функции JavaScript. где я извлекаю необходимую информацию из формы страниц.
моя проблема заключается в том, что когда я вызываю эту функцию, вся страница перезагружается, но я только хочу, чтобы панель обновления была перезагружена.
8 ответов:
вот полное решение
весь тег формы asp.net страница
<form id="form1" runat="server"> <asp:LinkButton ID="LinkButton1" runat="server" /> <%-- included to force __doPostBack javascript function to be rendered --%> <input type="button" id="Button45" name="Button45" onclick="javascript:__doPostBack('ButtonA','')" value="clicking this will run ButtonA.Click Event Handler" /><br /><br /> <input type="button" id="Button46" name="Button46" onclick="javascript:__doPostBack('ButtonB','')" value="clicking this will run ButtonB.Click Event Handler" /><br /><br /> <asp:Button runat="server" ID="ButtonA" ClientIDMode="Static" Text="ButtonA" /><br /><br /> <asp:Button runat="server" ID="ButtonB" ClientIDMode="Static" Text="ButtonB" /> </form>
все содержимое класса кода страницы
Private Sub ButtonA_Click(sender As Object, e As System.EventArgs) Handles ButtonA.Click Response.Write("You ran the ButtonA click event") End Sub Private Sub ButtonB_Click(sender As Object, e As System.EventArgs) Handles ButtonB.Click Response.Write("You ran the ButtonB click event") End Sub
- кнопка LinkButton включена, чтобы гарантировать, что функция javascript _ _ doPostBack отображается клиенту. Простое наличие кнопок управления не приведет к тому, что эта функция __doPostBack будет отображаться. Эта функция будет оказана в силу иметь разнообразие контроли на большинств ASP.NET страницы, поэтому пустая кнопка ссылки обычно не требуется
что происходит?
два элемента управления вводом отображаются для клиента:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
__EVENTTARGET
получает аргумент 1 из _ _ doPostBack__EVENTARGUMENT
получает аргумент 2 из _ _ doPostBackфункция __doPostBack отображается следующим образом:
function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } }
- как вы можете видеть, он присваивает значения скрытым входам.
когда форма отправляет / обратная передача происходит:
- если вы указали уникальный идентификатор кнопки управления сервером, чей обработчик нажатия кнопки вы хотите запустить (
javascript:__doPostBack('ButtonB','')
, затем будет запущен обработчик нажатия кнопки для этой кнопки.что делать, если я не хочу запускать обработчик кликов, но хочу сделать что-то другое вместо этого?
вы можете передать все, что вы хотите, как аргументы для
__doPostBack
затем вы можете проанализировать скрытые входные значения и выполнить определенный код соответственно:
If Request.Form("__EVENTTARGET") = "DoSomethingElse" Then Response.Write("Do Something else") End If
Другие Примечания
- что делать, если я не знаю идентификатор элемента управления, чей обработчик щелчка я хочу запустить?
- если это не допускается
ClientIDMode="Static"
, тогда вы можете сделать что-то вроде этого:__doPostBack('<%= myclientid.UniqueID %>', '')
.- или:
__doPostBack('<%= MYBUTTON.UniqueID %>','')
- это введет уникальный идентификатор элемента управления в javascript, если вы этого пожелаете
в Phairoh: используйте это в разделе/компонент только в том случае, если название группы меняется
<script type="text/javascript"> <!-- //must be global to be called by ExternalInterface function JSFunction() { __doPostBack('<%= myUpdatePanel.ClientID %>', ''); } --> </script>
хотя решение Файро кажется теоретически обоснованным, я также нашел другое решение этой проблемы. Передав идентификатор UpdatePanels в качестве параметра (цели события) для функции doPostBack, панель обновления отправит назад, но не всю страницу.
__doPostBack('myUpdatePanelId','')
* Примечание: второй параметр предназначен для добавления событий args
надеюсь, это кому-то поможет!
EDIT: так что, похоже, этот же совет был дан выше, когда я набирал:)
Если у кого-то возникли проблемы с этим (как и у меня), вы можете получить код обратной передачи для кнопки, добавив к нему атрибут UseSubmitBehavior="false". Если вы изучите визуализированный источник кнопки, вы увидите точный javascript, который вам нужно выполнить. В моем случае он использовал имя кнопки, а не идентификатор.
вы пробовали передать идентификатор клиента панели обновления в функцию _ _ doPostBack? Моя команда сделала это, чтобы обновить панель обновления и, насколько я знаю, это сработало.
__doPostBack(UpdatePanelClientID, '**Some String**');
используя
__doPostBack
прямо оооочень 2000-х годов. Кого кодирование-форм в 2018 использует GetPostBackEventReference(более серьезно, хотя, добавив в качестве ответа для полноты. Используя
__doPostBack
напрямую-это плохая практика (один префикс подчеркивания обычно указывает на частный член, а двойной указывает на более универсальный частный член), хотя он, вероятно, не изменится или не устареет в этот момент. Мы имеем полностью поддержанный механизм внутри ClientScriptManager.GetPostBackEventReference.)предполагая, что ваш btnRefresh находится внутри нашей UpdatePanel и вызывает обратную передачу, Вы можете использовать GetPostBackEventReference следующим образом (вдохновения):
function RefreshGrid() { <%= ClientScript.GetPostBackEventReference(btnRefresh, String.Empty) %>; }
во-первых, не используйте панели обновления. Они являются второй самой злой вещью, которую Microsoft когда-либо создавала для веб-разработчика.
во-вторых, если вы должны используйте панели обновления, попробуйте установить для свойства UpdateMode значение Conditional. Затем добавьте триггер к элементу управления Asp:Hidden, который вы добавляете на страницу. Назначьте событие изменения в качестве триггера. В событии dragstop измените значение скрытого элемента управления.
Это непроверено, но теория кажется звук... Если это не сработает, вы можете попробовать то же самое с кнопкой asp:, просто установите на ней стиль display:none и используйте событие click вместо события change.