ASP.NET обратная передача с помощью JavaScript


у меня есть несколько маленьких divс использованием jQuery перетаскивать. Эти div s помещаются в UpdatePanel, и на dragstop я использую _doPostBack() функции JavaScript. где я извлекаю необходимую информацию из формы страниц.

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

8 77

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.

вы не можете позвонить _doPostBack() потому что это заставляет подчинение формы. Почему бы вам не отключить PostBack на UpdatePanel?