Mam kilka małych, div
które jQuery
używają draggable. Są div
one umieszczane w pliku UpdatePanel
, a na dragstop używam _doPostBack()
funkcji JavaScript, w której wydobywam niezbędne informacje z formularza strony.
Mój problem polega na tym, że kiedy wywołuję tę funkcję, cała strona jest ponownie ładowana, ale chcę tylko załadować ponownie panel aktualizacji.
javascript
asp.net
webforms
updatepanel
postback
ErnieStings
źródło
źródło
Odpowiedzi:
Oto kompletne rozwiązanie
Cały tag formularza strony 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>
Cała zawartość klasy związanej z kodem strony
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
Co się dzieje?
Klientowi są renderowane dwie kontrolki wejściowe:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
__EVENTTARGET
otrzymuje argument 1 z __doPostBack__EVENTARGUMENT
otrzymuje argument 2 z __doPostBackFunkcja __doPostBack jest renderowana w następujący sposób:
function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } }
Po przesłaniu formularza / ogłoszeniu zwrotnym:
javascript:__doPostBack('ButtonB','')
wówczas zostanie uruchomiony moduł obsługi kliknięcia przycisku dla tego przycisku.Co jeśli nie chcę uruchamiać modułu obsługi kliknięć, ale zamiast tego chcę zrobić coś innego?
Możesz przekazać, co chcesz, jako argumenty
__doPostBack
Następnie możesz przeanalizować ukryte wartości wejściowe i odpowiednio uruchomić określony kod:
If Request.Form("__EVENTTARGET") = "DoSomethingElse" Then Response.Write("Do Something else") End If
Inne notatki
ClientIDMode="Static"
, można zrobić coś takiego:__doPostBack('<%= myclientid.UniqueID %>', '')
.__doPostBack('<%= MYBUTTON.UniqueID %>','')
źródło
Per Phairoh: Użyj tego na stronie / komponencie na wypadek zmiany nazwy panelu
<script type="text/javascript"> <!-- //must be global to be called by ExternalInterface function JSFunction() { __doPostBack('<%= myUpdatePanel.ClientID %>', ''); } --> </script>
źródło
O ile rozwiązanie Phairoh wydaje się teoretycznie trafne, o tyle znalazłem też inne rozwiązanie tego problemu. Przekazując identyfikator UpdatePanels jako parametr (cel zdarzenia) dla funkcji doPostBack, panel aktualizacji odeśle z powrotem, ale nie całą stronę.
__doPostBack('myUpdatePanelId','')
* uwaga: drugi parametr służy do dodawania argumentów zdarzeń
mam nadzieję, że to komuś pomoże!
EDYCJA: wygląda na to, że ta sama rada została podana powyżej, gdy pisałem :)
źródło
Używanie
__doPostBack
bezpośrednio jest baaardzo XXI wieku. Każdy, kto koduje WebForms w 2018 roku, używa GetPostBackEventReference(Poważniej jednak, dodanie tego jako odpowiedzi na kompletność. Używanie
__doPostBack
bezpośrednio jest złą praktyką (pojedynczy prefiks podkreślony zwykle wskazuje członka prywatnego, a podwójny oznacza bardziej uniwersalnego członka prywatnego), chociaż prawdopodobnie nie zmieni się ani nie stanie się przestarzały w tym punkt. Mamy w pełni obsługiwany mechanizm w ClientScriptManager.GetPostBackEventReference .)Zakładając, że twój btnRefresh znajduje się w naszym UpdatePanel i powoduje ogłaszanie zwrotne, możesz użyć GetPostBackEventReference w następujący sposób ( inspiracja ):
function RefreshGrid() { <%= ClientScript.GetPostBackEventReference(btnRefresh, String.Empty) %>; }
źródło
Jeśli ktoś ma z tym problem (tak jak ja), możesz uzyskać kod postback dla przycisku, dodając do niego atrybut UseSubmitBehavior = "false". Jeśli zbadasz wyrenderowane źródło przycisku, zobaczysz dokładny javascript, który musisz wykonać. W moim przypadku była to nazwa przycisku, a nie identyfikator.
źródło
Czy próbowałeś przekazać identyfikator klienta panelu aktualizacji do funkcji __doPostBack? Mój zespół zrobił to, aby odświeżyć panel aktualizacji i, o ile wiem, zadziałał.
__doPostBack(UpdatePanelClientID, '**Some String**');
źródło
Po pierwsze, nie używaj paneli aktualizacji. Są drugą najgorszą rzeczą, jaką Microsoft kiedykolwiek stworzył dla twórców stron internetowych.
Po drugie, jeśli musisz użyć paneli aktualizacji, spróbuj ustawić właściwość UpdateMode na warunkowe. Następnie dodaj wyzwalacz do kontrolki Asp: Hidden, którą dodajesz do strony. Przypisz zdarzenie zmiany jako wyzwalacz. W zdarzeniu dragstop zmień wartość ukrytej kontrolki.
To nie jest testowane, ale teoria wydaje się rozsądna ... Jeśli to nie zadziała, możesz spróbować tego samego z przyciskiem asp:, po prostu ustaw styl display: none i użyj zdarzenia click zamiast zdarzenia change.
źródło
Nie możesz zadzwonić,
_doPostBack()
ponieważ wymusza to złożenie formularza. Dlaczego nie wyłączysz opcjiPostBack
naUpdatePanel
?źródło