ASP.NET postback с JavaScript
у меня несколько маленьких div
s, который использует 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 отображается клиенту. Простое наличие элементов управления Button не приведет к отображению этой функции _ _ 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();
}
}
- как вы можете видеть, он присваивает значения скрытым входам.
когда форма отправляет / postback происходит:
- если вы предоставили UniqueID кнопки управления сервером, которую вы хотите запустить (
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, если пожелаете ... --26-->
- если не приемлемо установить
Per 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
непосредственно является sooooo 2000-х годов. Любой, кто кодирует WebForms в 2018 году, использует GetPostBackEventReference
(более серьезно, хотя, добавив в качестве ответа для полноты. С помощью __doPostBack
напрямую-плохая практика (один префикс подчеркивания обычно указывает на частный член, а двойной-на более универсальный частный член), хотя он, вероятно, не изменится или не устареет на данный момент. Мы имеем польностью поддержанный механизм внутри ClientScriptManager.GetPostBackEventReference.)
предполагая, что ваш btnRefresh находится внутри нашей UpdatePanel и вызывает обратную передачу, Вы можете использовать GetPostBackEventReference следующим образом (вдохновения):
function RefreshGrid() {
<%= ClientScript.GetPostBackEventReference(btnRefresh, String.Empty) %>;
}
во-первых, не используйте панели обновления. Они являются второй самой злой вещью, которую Microsoft когда-либо создавала для веб-разработчика.
во-вторых, если вы должны используйте панели обновления, попробуйте установить свойство UpdateMode в Conditional. Затем добавьте триггер в элемент управления Asp:Hidden, добавляемый на страницу. Назначить событие change в качестве триггера. В событии dragstop измените значение скрытого элемента управления.
Это непроверено, но теория кажется звук... Если это не работает, вы можете попробовать то же самое с помощью кнопки asp:, просто установите на нем стиль display:none и используйте событие click вместо события change.
вы не можете позвонить _doPostBack()
потому что это заставляет подчинение формы. Почему бы вам не отключить PostBack
на UpdatePanel
?