ASP.NET postback с JavaScript

у меня несколько маленьких divs, который использует jQuery перетаскивать. Эти divs помещаются в 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?