Jak korzystać z __doPostBack ()


161

Próbuję utworzyć asynchroniczne ogłaszanie zwrotne w ASP.NET przy użyciu __doPostBack(), ale nie mam pojęcia, jak to zrobić. Chcę używać waniliowego JavaScript.

Coś prostego, jak kliknięcie przycisku, może spowodować uruchomienie __doPostBack()zdarzenia. Próbuję się tylko dowiedzieć, jak działa mechanizm.



9
Przede wszystkim __doPostBack nie wywołuje akcji asynchronicznej, chyba że zostanie wyzwolona przez kontrolkę wewnątrz UpdatePanel.
Ladislav Mrnka

Dlaczego jest to otagowane C # i javascript . Rozumiem część javascript , ale nie część C # .
Solomon Ucko,

1
@Solomon Ucko - ponieważ __doPostBack () powoduje POST strony do implementacji po stronie serwera, która najprawdopodobniej będzie w C # (może to być VB.NET)
sh1rts

1
Chociaż zwykle działa, ręczne wstawianie __doPostBacknie jest w rzeczywistości obsługiwane. Jeśli na Twojej stronie nie ma nic, co wyzwala ogłaszanie zwrotne, strona asp.net może pominąć definiowanie __doPostBackfunkcji. Obsługiwanym podejściem jest wywołanie ClientScriptManager.GetPostBackEventReference, które zwraca ciąg znaków w formularzu __doPostBack(...)i zapewnia, że __doPostBackjest on zdefiniowany.
Brian,

Odpowiedzi:


156

Możesz to wypróbować w swoim formularzu internetowym za pomocą przycisku o nazwie btnSave, na przykład:

<input type="button" id="btnSave" onclick="javascript:SaveWithParameter('Hello Michael')" value="click me"/>

<script type="text/javascript">
function SaveWithParameter(parameter)
{
  __doPostBack('btnSave', parameter)
}
</script>

A w swoim kodzie z tyłu dodaj coś takiego, aby odczytać wartość i operować na niej:

public void Page_Load(object sender, EventArgs e)
{
  string parameter = Request["__EVENTARGUMENT"]; // parameter
  // Request["__EVENTTARGET"]; // btnSave
}

Spróbuj i daj nam znać, czy to zadziałało.


1
Tylko krótkie pytanie, __EVENTARGUMENT byłby parametrem czy btnSave?
harsimranb

3
To jest parametr. __EVENTTARGET da ci przycisk.
Pan Pan

co jeśli mam dwa lub więcej przycisków, które wykonują __doPostBack, to jak mogę je rozróżnić po stronie serwera w page_load ().
khalid khan

1
Co się dzieje, gdy mam więcej niż jeden parametr?
Wilson

1
@Wilson jako kolejna myśl, że twoim argumentem mogą być dane Json, które mogą mapować na obiekt w twoim C #, możesz następnie użyć Json.net do deserializacji / serializacji do obiektu itp.
Pan

25

Jest to również dobry sposób na uzyskanie kontroli po stronie serwera w celu ogłaszania zwrotnego w oknie dialogowym FancyBox i / lub jQuery . Na przykład w FancyBox-div:

   <asp:Button OnClientClick="testMe('param1');" ClientIDMode="Static"  ID="MyButton"  runat="server" Text="Ok" >
</asp:Button>

JavaScript:

function testMe(params) {
    var btnID= '<%=MyButton.ClientID %>';          
    __doPostBack(btnID, params);
}

Ładowanie strony po stronie serwera:

 string parameter = Request["__EVENTARGUMENT"];
 if (parameter == "param1")
     MyButton_Click(sender, e);

4
powinien używać UniqueID, a nie ClientID.
Garr Godfrey

Lub ustaw ClientIDMode="Static"atrybut MyButton, aby ASP nie zmieniał identyfikatora przycisku.
David R Tribble

14

Oto krótki poradnik, jak to __doPostBack()działa.

Szczerze mówiąc, nie używam go zbyt często; przynajmniej bezpośrednio. Wiele formantów serwera (np, Button, LinkButton, ImageButton, części GridView, itp) używania __doPostBackjako ich postu mechanizmu powrotem.


6 lat później; Będę w szoku, jeśli nadal będę tego używać. Podejście do tworzenia stron internetowych ogólnie odeszło od mentalności, w której używa się takich rzeczy.
Phil

@Phil - haha, czytałem ten wątek wczoraj, patrząc na błąd, w którym to zostało zaimplementowane :) Wydaje się dość archaiczne w dzisiejszych czasach
Terry Delahunt

12
Przewijamy do przodu 6 lat ... a ASP.NET Web Forms nadal to robi. Stąd przytłaczające głosowanie za zaakceptowaną odpowiedzią.
kbrimington,

@kbrimington: Nie powiedziałem, że ASP.NET nie będzie „nadal tego robić”. Nie spodziewam się, że to wiele się zmieni. Chodziło mi o to, że mniej osób korzysta z ASP.NET WebForm do nowego programowania, a inni migrują z niego.
Phil

10

Chciałbym tylko dodać coś do tego posta dla asp:button. Wypróbowałem clientId i wydaje mi się, że nie działa:

__doPostBack('<%= btn.ClientID%>', '');

Jednak pobranie UniqueId wydaje się być wysyłane z powrotem na serwer, jak poniżej:

__doPostBack('<%= btn.UniqueID%>', '');

Może to pomóc komuś innemu w przyszłości, dlatego opublikowanie tego.


1
Tak, miałem z tym problem ClientID, ponieważ używałem ClientIDMode = Static. Korzystanie UniqueIDzadziałało.
Phiter

Próbowałem, aby to zadziałało, ale ani ClientID, ani UniqueId nie działają dla mnie.
atamata

O MÓJ BOŻE! Kilka dni próbowałem rozwiązać ten problem. UniqueID rozwiązało problem. Dzięki stary!
Faiz Infy

2

Stare pytanie, ale chciałbym coś dodać: dzwoniąc doPostBack()możesz użyć metody obsługi serwera dla akcji.

Dla przykładu:

__doPostBack('<%= btn.UniqueID%>', 'my args');

Zapali się na serwerze:

protected void btn_Click(object sender, EventArgs e)

Nie znalazłem lepszego sposobu, aby uzyskać argument, więc nadal używam Request["__EVENTARGUMENT"].


0

Jak powiedzieli inni, musisz podać UniqueID kontrolki do metody __doPostback ().

__doPostBack('<%= btn.UniqueID %>', '');

Na serwerze przesłane wartości formularza są identyfikowane przez atrybut nazwy pól na stronie.

Powodem, dla którego UniqueID działa, jest to, że UniqueID i nazwa są w rzeczywistości tym samym, gdy formant serwera jest renderowany w HTML.

Oto artykuł opisujący, czym jest UniqueID:

Właściwość UniqueID służy również do podawania wartości atrybutu HTML „nazwa” pól wejściowych (pól wyboru, list rozwijanych i pól ukrytych). UniqueID odgrywa również ważną rolę w ogłoszeniach zwrotnych. Właściwość UniqueID kontrolki serwera, która obsługuje ogłaszanie zwrotne, zawiera dane dla pola ukrytego __EVENTTARGET. Środowisko uruchomieniowe ASP.NET używa następnie pola __EVENTTARGET, aby znaleźć kontrolkę, która wyzwoliła ogłaszanie zwrotne, a następnie wywołuje metodę RaisePostBackEvent.

src: https://www.telerik.com/blogs/the-difference-between-id-clientid-and-uniqueid


0

Tak to robię

    public void B_ODOC_OnClick(Object sender, EventArgs e)
    {
        string script="<script>__doPostBack(\'fileView$ctl01$OTHDOC\',\'{\"EventArgument\":\"OpenModal\",\"EncryptedData\":null}\');</script>";
        Page.ClientScript.RegisterStartupScript(this.GetType(),"JsOtherDocuments",script);               
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.