Co to jest ogłoszenie zwrotne?

83

Najlepsze wyjaśnienie postBack, jakie znalazłem, pochodzi z Wiki.

ogłaszanie zwrotne to HTTP POST do tej samej strony, na której znajduje się formularz.

Chociaż artykuł wyjaśnia, w jaki sposób druga strona była potrzebna w ASP, ale nie jest już potrzebna w ASP.NET, nie zawiera zbyt wielu szczegółów ani tła. Szukam cholernej księgi informacji na temat PostBacks. Podobnie jak proste pytanie „jak mogę posprzątać dom” można rozwiązać w tej 900-stronicowej książce . Nie potrzebuję 900 stron, ale proszę o szczegóły. Znalazłem fajny mały samouczek dotyczący cyklu życia ASP.NET, ale poważnie omawia on ogłoszenia zwrotne (między innymi).

Zwracam się do programistów, którzy byli przed .NET i naprawdę nie biorą tego typu rzeczy za coś oczywistego. Książki i hiperłącza to rozsądne odpowiedzi lub dodatki do Twojej odpowiedzi.

P. Brian Mackey
źródło
Najbardziej poprawna odpowiedź dotycząca .NET -> stackoverflow.com/questions/183254/what-is-a-postback
Don Cheadle
W przypadku klasycznej funkcji po stronie serwera ASP może to pomóc: stackoverflow.com/a/58054341/8624010
tb-mtg
Ta klasyczna funkcja po stronie serwera ASP może pomóc: stackoverflow.com/a/58054341/8624010
tb-mtg

Odpowiedzi:

62

Jak dotąd wielokrotnie widziałem właściwą odpowiedź, do której nawiązywałam, i prawie wszyscy unikają tego, co subiektywnie uważam za cel.

Zacznijmy od podstaw:

Żądaniem HTTP może być dowolne zlecenie HTTP , ale dwa najczęściej używane przez ludzi to GET i POST. Cóż, to są dwa, których programista używa najczęściej. Pozostałe mają jakiś cel, jeśli są zaimplementowane na serwerze. Wysyłając informacje do serwera, możesz to zrobić za pomocą adresu URL (aby zażądać strony) lub w treści żądania (na przykład POST, PUT, DELETE).

Teraz zauważysz (jestem pewien), że adres URL w żądaniu GET często zawiera dane i to prawda, ale według W3C nie powinieneś używać GET do zmiany stanu, a mimo to często to robimy. To rodzaj włamania, co do którego wszyscy zgadzamy się, że jest rzeczywistym użyciem, a nie włamaniem. Niezależnie od tego, czy będzie to hack, czy rzeczywisty szczegół implementacji, pozostawiam Tobie.

Więc kiedy wysyłasz treść POST-a (pomijając na razie inne, możesz to rozgryźć stąd) z elementami formularza, odsyłasz z powrotem pewne elementy. Jak te elementy są definiowane jest do was i do środowiska w którym pracujesz. Państwo mogli dodawać do serwera z elementem JSON w organizmie lub z XML lub z pól formularza. Generalnie posty wykonujemy z elementu FORM w treści HTML.

Teraz wszyscy mówią: „och, ogłoszenie zwrotne to kolejne żądanie skierowane do strony”. Ale to nieprawda. Postback ma miejsce, gdy wysyłasz dane przez POST -> z powrotem na serwer. Mówię to, ponieważ różnica między żądaniem GET a żądaniem POST polega na tym, że dane są zawarte w treści (i użytym czasowniku, ale klient zwykle wie, jak sobie z tym poradzić). Państwo mogłoby ogłaszanie się na stronie po raz pierwszy strona jest odwiedzana, aw rzeczywistości ASP.NET ma narzędzia, które robi się w bibliotece. Z pewnością możesz mieć dane POST klienta stacjonarnego na serwerze (pomyśl o Twitterze) bez wyświetlania żadnej strony internetowej z serwera (ok, więc Twitter prawdopodobnie nie jest najlepszą koncepcją do wykorzystania na przykład tutaj, ale chcę zilustrować, że ty może użyć klienta, który nie wyświetla strony internetowej, więc nie jest wymagane żadne żądanie).

Tak naprawdę to, co powinieneś przeczytać w "postback", to "PRZEKAZUJĘ ZWROTNE dane na serwer w celu przetworzenia". Zakłada się, że początkowo pobrałeś stronę za pomocą GET, aby pokazać użytkownikowi <form>element, który ma <input>pola, z którymi może wchodzić w interakcje, i że na koniec wysyłasz dane z powrotem. Ale mam nadzieję, że widzisz, że nie musi to być w tej kolejności.

Oto więc coś do rozważenia:

Co jeśli dał użytkownikowi stronę z grupą <input>s, a nie <form>, ale zamiast tego miał przycisk okablowany w javascript aby Concat wszystkie te <input>sz &value-n=i wysłać je jako GET? Robi to samo, ale narusza koncepcję używania GET tylko do żądań. (prawdopodobnie) następująca dyskusja zachęca mnie do podkreślenia, że ​​GET nie powinien mieć żadnych skutków ubocznych (brak wartości aktualizujących)

W ten sposób możesz na przykład wysłać komuś link do wyszukiwarki Google. Więc nie ZAWSZE musimy POSTAWAĆ ZWROTNIE na serwer, aby uzyskać dane.

Mam nadzieję że to pomoże. Twoje zdrowie

jcolebrand
źródło
1
Does the same thing, but violates that concept of only using GET for requests. (possibly)Nie ma mowy o tym. Żądania GET nie powinny mieć skutków ubocznych. Powinni jedynie zażądać danych (stąd nazwa GET ).
George Marian
34
-1: Pytanie jest oznaczone jako ASP.NET. W ASP.NET termin „ogłaszanie zwrotne” ma określone znaczenie obejmujące zdarzenia cyklu życia strony, stan widoku, testowanie IsPostBack, ...
Ian Mercer
@high M $ może próbować przedefiniować, w / e chcą. Nie oznacza to jednak, że musimy to zaakceptować.
George Marian
@hightechrider, czy możesz wyjaśnić części tego cyklu bez tego wyjaśnienia?
jcolebrand
2
Zasadniczo ogłaszanie zwrotne to tylko POST HTTP do dowolnej strony?
Koray Tugay
29

POSTBACK: Część wymyślonej przez ASP.NET techniki ukrywania prawdziwej bezstanowej natury sieci / HTTP za stanową fasadą. Skutkuje to złożonym kodem (IsPostback, ...), trudnym do zrozumienia cyklem życia strony, wieloma różnymi zdarzeniami, ... i licznymi problemami (rozmiar ViewState, lepkość farmy internetowej, serwery stanu, ostrzeżenia przeglądarki (nie używa wzorca PRG) , ...)

Zamiast tego zobacz ASP.NET MVC .

Ian Mercer
źródło
3
Łał, naprawdę? Jestem prawie pewien, że słyszałem ogłaszanie zwrotne używane w odwołaniach do innych frameworków poza asp.net… Nie mylić tego biednego chłopca.
jcolebrand
3
Pytanie jest oznaczone jako ASP.NET. W kontekście ASP.NET „Postback” ma określone znaczenie. Zobacz na przykład: msdn.microsoft.com/en-us/library/…
Ian Mercer
Poza kontekstem ogłaszania zwrotnego ASP.NET nadal jest prawidłową akcją.
jcolebrand
Powinieneś wyjaśnić, że istnieją inne robocze definicje tego terminu, jeśli naprawdę chcesz uniknąć pomylenia PO.
George Marian
4
Jako wieloletni programista sieciowy spoza Microsoft nigdy nie słyszałem terminu „PostBack” poza kontekstem .net. Publikowanie danych i termin PostBack to bardzo różne rzeczy. To doskonała odpowiedź.
tommybananas
28

Zobacz Omówienie cyklu życia strony ASP.NET w witrynie MSDN, aby uzyskać dobre ogólne wprowadzenie dotyczące tego, co się dzieje, gdy żądanie trafia na serwer.

PostBack to każde żądanie dotyczące strony, która nie jest pierwszym żądaniem. PostBack zawsze będzie odpowiedzią na działanie użytkownika (najczęściej wywoływane przez przycisk, kontrolkę AutoPostBack lub Ajax).

Yaakov Ellis
źródło
1
Mimo, że jest to stary temat, chciałem zwrócić uwagę, że Twoja odpowiedź jest częściowo błędna (więc inni nie są wprowadzani w błąd). Możesz skierować akcję formularza na dowolny adres URL, ponieważ może to być pierwsze żądanie. Ważne jest to, że jest to POST.
Michael Goss
13

Post zwrotny to podróż w obie strony od klienta (przeglądarki) do serwera, a następnie z powrotem do klienta.

Umożliwia to przejrzenie strony przez silnik asp na serwerze i aktualizację zawartości dynamicznej.

tutaj jest ładne wyjaśnienie

David Kethel
źródło
10

ASP.Net wykorzystuje nową koncepcję (no cóż, nowa w porównaniu do asp ... jest teraz przestarzała) ViewState do utrzymania stanu formantów asp.net. Co to znaczy? Krótko mówiąc, jeśli wpiszesz coś w polu tekstowym lub wybierzesz menu z listy rozwijanej, zapamięta wartości po kliknięciu przycisku. Stary ASP zmusiłby cię do napisania kodu, aby zapamiętać te wartości.

Jest to przydatne, gdy użytkownik napotka błąd. Zamiast zajmować się programistą pamiętaniem o ponownym wypełnieniu każdej kontrolki sieci Web, stan widoku asp.net robi to automatycznie. Jest to również przydatne, ponieważ teraz kod znajdujący się za nim może uzyskać dostęp do wartości tych kontrolek w formularzu sieci Web asp.net za pomocą funkcji Intellisense.

Jeśli chodzi o wysyłanie wiadomości na tę samą stronę, tak, przycisk „Prześlij” spowoduje wysłanie wiadomości do modułu obsługi zdarzeń w kodzie za stroną. To do modułu obsługi zdarzeń w kodzie znajdującym się za nim, jeśli zajdzie taka potrzeba, należy przekierowanie na inną stronę (lub wyświetlenie komunikatu o błędzie na stronie lub cokolwiek innego, co może być konieczne do zrobienia).

Scottie
źródło
8

Definicja ogłaszania zwrotnego w Wikipedii jest całkiem dobra, ale dodałbym, co następuje: ogłaszanie zwrotne to kolejne HTTP POST do tej samej strony, na której znajduje się formularz.

Jeśli mam stronę z formularzem i zamiast przekierowywać przeglądarkę na inną stronę, na której będzie przetwarzany formularz, zamiast przycisku Prześlij, chcę, aby przycisk Prześlij odświeżył bieżącą stronę (i wykonał określone kroki, aby zweryfikować / zapisać przypuszczalnie), to przycisk Prześlij został wysłany z powrotem na bieżącą stronę.

Ogłoszenia zwrotne mogą być pełne (odśwież całą stronę) lub częściowe (w przypadku, gdy używany jest AJAX). Częściowe ogłaszanie zwrotne strony spowoduje ponowne renderowanie tylko części strony (np. Pojedynczej listy rozwijanej, tabeli itp.).

jwheron
źródło
4

W starym kodzie HTML jedynym sposobem zaktualizowania strony internetowej jest ponowne wysłanie nowej strony internetowej do przeglądarki klienta. To właśnie robiła ASP, musisz zrobić to wywołanie „PostBack”, aby wysłać zaktualizowaną stronę do klienta.

W ASP .NET nie musisz ponownie wysyłać całej strony internetowej. Możesz teraz używać AJAX lub innych formantów ASP.NET, dzięki czemu nie musisz ponownie wysyłać całej strony internetowej.

Jeśli odwiedzisz jakąś starą witrynę internetową, zauważysz, że po kliknięciu cała strona musi zostać odświeżona, to jest stary ASP. W większości nowoczesnych witryn internetowych zauważysz, że Twoja przeglądarka nie musi odświeżać całej strony, aktualizuje tylko część treści, która wymaga aktualizacji. Na przykład w Stackoverflow widzisz, że strona aktualizuje tylko zawartość, a nie całą stronę internetową.

dsum
źródło
To trochę prawda, ale może trochę mylące. Standardowe ogłoszenia zwrotne asp.net WYSYŁAJĄ całą stronę wraz ze stanem widoku z powrotem na serwer i odświeżają całą stronę. AJAX sprawił, że było to trochę przyjemniejsze, dzięki możliwości publikowania tylko części strony.
Scottie,
3

Po prostu wpisz to małym kodem. Mam nadzieję, że to ci pomoże. Kiedy po raz pierwszy żądasz adresu URL strony. możesz wyświetlić jego kod źródłowy w większości przeglądarek. Poniżej znajduje się próbka.

Istotą funkcji Post Back jest faktycznie połączenie __doPostBackz serwerem, który przesyła wszystkie dane formularza otrzymane z pierwszego żądania z powrotem na serwer. ( __EVENTTARGETzawiera identyfikator formantu).

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
    NHibernate Demo
</title>
    <script language="javascript" type="text/javascript">
        function dopost() {
                __doPostBack('LinkButton1', '');    
        }
    </script>
</head>
<body>
    <h1>NHibernate Demo</h1>    
    <form name="ctl01" method="post" action="Default.aspx" id="ctl01">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTMxNzcwNTYyMWRkKHoXAC3dty39nROvcj1ZHqZ5FYY=" />
</div>

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['ctl01'];
if (!theForm) {
    theForm = document.ctl01;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>   
<div>
    <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="B2D7F301" />
    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwKZx5vTCgKM54rGBgLM9PumD20dn9KQguomfpAOdTG0r9Psa7al" />
</div>
        <a id="LinkButton1" href="javascript:__doPostBack('LinkButton1','')">LinkButton</a>
        <input type="button" value="testPostBack" id="testpostback" onclick="dopost();" />
    </form>
</body>
</html>
Joe.wang
źródło
2

Postback to żądanie, podczas którego ASP przywraca wartości właściwości kontrolek ze stanu widoku.

Waldemar Gałęzinowski
źródło
1

IsPostBackto właściwość Asp.Netstrony, która mówi, czy dana strona jest, on its initial loadi czy użytkownik wykonał przycisk na Twojej stronie internetowej, który spowodował, że strona ponownie opublikowała swój post.

więcej na ... Asp.Net ispostback ()

Walsh Regal
źródło