Postback là gì?


83

Lời giải thích tốt nhất mà tôi đã tìm thấy cho một bài đăng Trở lại là từ Wiki.

một bài đăng lại là một ĐĂNG HTTP đến cùng một trang có biểu mẫu.

Mặc dù bài viết giải thích cách trang thứ hai cần thiết trong ASP, nhưng không còn cần thiết trong ASP.NET, nó không cung cấp nhiều chi tiết hoặc nền tảng. Tôi đang tìm kiếm thông tin kỳ lạ trên PostBacks. Giống như câu hỏi đơn giản "làm thế nào tôi có thể dọn dẹp một ngôi nhà" có thể được giải quyết trong cuốn sách 900 trang này . Tôi không cần giá trị 900 trang, nhưng xin vui lòng chi tiết. Tôi đã tìm thấy một hướng dẫn nhỏ rất hay cho vòng đời của ASP.NET, nhưng nó thực sự bóng hơn các postbacks (trong số những thứ khác).

Tôi đang tìm kiếm các nhà phát triển đã có mặt trước .NET và thực sự không coi những thứ này là điều hiển nhiên. Sách và siêu liên kết là câu trả lời hợp lý hoặc bổ sung cho câu trả lời của bạn.


Câu trả lời đúng nhất liên quan đến .NET -> stackoverflow.com/questions/183254/what-is-a-postback
— Don Cheadle

Đối với một chức năng server-side ASP cổ điển, điều này có thể giúp: stackoverflow.com/a/58054341/8624010
— tb-mtg

ASP chức năng server-side cổ điển này có thể giúp: stackoverflow.com/a/58054341/8624010
— tb-mtg

Câu trả lời:


62

Cho đến nay, tôi đã thấy câu trả lời đúng được ám chỉ nhiều lần, và hầu như mọi người đều e dè những gì tôi cho là chủ quan là dấu hiệu.

Hãy bắt đầu với những điều cơ bản:

Yêu cầu HTTP có thể là bất kỳ động từ HTTP nào , nhưng hai động từ mà mọi người sử dụng nhiều nhất là GET và POST. Đó là hai cách mà một lập trình viên sử dụng thường xuyên nhất. Tất cả những người khác đều có một số mục đích, nếu chúng được triển khai trên máy chủ. Khi bạn gửi thông tin đến máy chủ, bạn có thể làm như vậy thông qua việc sử dụng URL (để yêu cầu một trang) hoặc trong phần nội dung của yêu cầu (ví dụ: POST, PUT, DELETE).

Bây giờ bạn sẽ nhận xét (tôi chắc chắn) rằng URL trong yêu cầu GET thường chứa dữ liệu và điều này đúng, nhưng theo W3C, bạn không nên sử dụng GET để thay đổi trạng thái, nhưng chúng tôi vẫn thường làm vậy. Đó là một loại hack mà tất cả chúng ta đều đồng ý là sử dụng thực tế chứ không phải hack. Cho dù điều đó làm cho nó trở thành một cuộc tấn công hay một chi tiết triển khai thực tế, tôi sẽ để lại cho bạn.

Vì vậy, khi bạn gửi nội dung của POST (bỏ qua những phần khác bây giờ, bạn có thể tìm ra nó từ đây) với các phần tử biểu mẫu, bạn đang gửi lại một số phần tử nhất định. Cách xác định các phần tử đó là tùy thuộc vào bạn và môi trường bạn đang làm việc. Bạn có thể đăng lên máy chủ có phần tử JSON trong nội dung hoặc với XML hoặc với các trường biểu mẫu. Nói chung chúng ta làm bài đăng của một yếu tố MẪU trong cơ thể của HTML.

Bây giờ mọi người nói, "ồ, một bài đăng lại là một yêu cầu tiếp theo đối với một trang." Nhưng, điều đó không đúng. Postback là khi bạn gửi dữ liệu qua POST -> quay lại máy chủ. Tôi nói điều này bởi vì sự khác biệt giữa yêu cầu GET và yêu cầu POST là nếu dữ liệu được bao gồm trong nội dung (và động từ được sử dụng, nhưng khách hàng thường biết cách đối phó với điều đó). Bạn có thể đăng lại trang vào lần đầu tiên trang được truy cập và trên thực tế ASP.NET có các công cụ để làm điều đó trong thư viện. Bạn chắc chắn có thể có một ứng dụng khách trên máy tính để bàn ĐĂNG dữ liệu lên máy chủ (nghĩ là Twitter) mà không hiển thị bất kỳ trang web nào từ máy chủ (ok, vì vậy twitter có lẽ không phải là khái niệm tốt nhất để sử dụng cho một ví dụ ở đây, nhưng tôi muốn minh họa rằng bạn có thể sử dụng ứng dụng khách không hiển thị trang web, vì vậy không cần yêu cầu).

Vì vậy, thực sự những gì bạn nên đọc ở đó trong "postback" là "Tôi đang ĐĂNG dữ liệu LẠI về máy chủ để xử lý". Có thể giả định rằng ban đầu bạn truy xuất trang bằng GET để hiển thị cho người dùng <form>phần tử có <input>các trường để họ tương tác và cuối cùng bạn đang gửi dữ liệu trở lại. Nhưng tôi hy vọng bạn có thể thấy rằng nó không nhất thiết phải theo thứ tự đó.

Vì vậy, đây là một số điều khác cần xem xét:

Điều gì sẽ xảy ra nếu bạn cung cấp cho người dùng một trang với một loạt các chữ cái <input>và không <form>nhưng thay vào đó, có một nút được kết nối bằng javascript để nối tất cả những cái đó <input>với &value-n=và gửi chúng dưới dạng GET? Thực hiện điều tương tự, nhưng vi phạm khái niệm chỉ sử dụng GET cho các yêu cầu. (có khả năng) cuộc thảo luận tiếp theo khuyến khích tôi củng cố rằng GET không nên có tác dụng phụ (không có giá trị cập nhật)

Chẳng hạn như tại sao bạn có thể gửi cho ai đó một liên kết đến tìm kiếm trên google. Vì vậy chúng ta KHÔNG LUÔN phải ĐĂNG LẠI máy chủ để lấy dữ liệu.

Hi vọng điêu nay co ich. Chúc mừng


1
Does the same thing, but violates that concept of only using GET for requests. (possibly)Không có khả năng về nó. Yêu cầu GET không được có tác dụng phụ. Họ chỉ nên yêu cầu dữ liệu (do đó có tên GET ).
— George Marian

34
-1: Câu hỏi được gắn thẻ ASP.NET. Trong ASP.NET thuật ngữ "Postback" có một cụ thể có nghĩa là liên quan đến các sự kiện vòng đời trang, ViewState, thử nghiệm IsPostBack, ...
— Ian Mercer

@high M $ có thể cố gắng xác định lại họ muốn. Tuy nhiên không có nghĩa là chúng ta phải chấp nhận.
— George Marian

@hightechrider bạn có thể giải thích các phần của chu trình đó mà không có lời giải thích mà tôi đưa ra được không?
— jcolebrand

2
Vì vậy, về cơ bản, một postback chỉ là một HTTP POST đến bất kỳ trang nào?
— Koray Tugay

29

POSTBACK: Một phần của kỹ thuật có sẵn của ASP.NET để ẩn bản chất không trạng thái thực sự của web / HTTP đằng sau một mặt tiền trạng thái. Điều này dẫn đến mã phức tạp (IsPostback, ...), vòng đời trang khó hiểu, nhiều sự kiện khác nhau, ... và nhiều vấn đề (kích thước ViewState, độ dính của trang web, máy chủ trạng thái, cảnh báo trình duyệt (không sử dụng mẫu PRG) , ...)

Thay vào đó, hãy xem ASP.NET MVC .


3
Ồ, thật sao? Tôi khá chắc rằng tôi đã nghe postback được sử dụng trong các tham chiếu đến các khung công tác khác ngoài asp.net .... Đừng nhầm lẫn với chàng trai tội nghiệp.
— jcolebrand

3
Câu hỏi được gắn thẻ ASP.NET. Trong ngữ cảnh của ASP.NET, "Postback" có một ý nghĩa cụ thể. Xem ví dụ: msdn.microsoft.com/en-us/library/…
— Ian Mercer

Và bên ngoài ngữ cảnh của ASP.NET postback vẫn là một hành động hợp lệ.
— jcolebrand

Bạn nên làm rõ rằng có những định nghĩa khác về thuật ngữ này, nếu bạn thực sự muốn tránh nhầm lẫn với OP.
— George Marian

4
Là một nhà phát triển web không phải của microsoft, tôi chưa bao giờ nghe thấy thuật ngữ 'PostBack' bên ngoài ngữ cảnh .net. Dữ liệu đăng và thuật ngữ PostBack là những thứ rất khác nhau. Đây là một câu trả lời hoàn hảo.
— tommybananas

28

Xem Tổng quan về Vòng đời của Trang ASP.NET trên MSDN để có phần giới thiệu chung tốt về những gì sẽ xảy ra khi một yêu cầu truy cập vào máy chủ.

PostBack là bất kỳ yêu cầu nào cho một trang không phải là yêu cầu đầu tiên. Một PostBack sẽ luôn phản hồi lại hành động của người dùng (được kích hoạt phổ biến nhất bởi một Nút, điều khiển AutoPostBack hoặc Ajax).


1
Mặc dù đây là một chủ đề cũ, nhưng tôi muốn chỉ ra rằng câu trả lời của bạn có một phần không chính xác (để những người khác không bị hiểu nhầm). Bạn có thể trỏ hành động biểu mẫu đến bất kỳ URL nào bạn muốn, trong đó nó có thể là yêu cầu đầu tiên. Điều quan trọng là nó là một BÀI ĐĂNG.
— Michael Goss,

13

Một bài trả lại là một chuyến đi vòng từ máy khách (Trình duyệt) đến máy chủ và sau đó trở lại máy khách.

Điều này cho phép bạn trang đi qua công cụ asp trên máy chủ và bất kỳ nội dung động nào sẽ được cập nhật.

đây là một lời giải thích hay


10

ASP.Net sử dụng một khái niệm mới (tốt, mới so với asp ... bây giờ nó đã lỗi thời) của ViewState để duy trì trạng thái của các điều khiển asp.net của bạn. Điều đó có nghĩa là gì? Tóm lại, nếu bạn nhập nội dung nào đó vào hộp văn bản hoặc chọn một danh sách thả xuống từ danh sách thả xuống, nó sẽ ghi nhớ các giá trị khi bạn nhấp vào một nút. Asp cũ sẽ buộc bạn phải viết mã để ghi nhớ những giá trị này.

Điều này rất hữu ích khi người dùng gặp lỗi. Thay vì lập trình viên phải đối mặt với việc ghi nhớ điền lại từng điều khiển web, dạng xem asp.net tự động thực hiện việc này cho bạn. Nó cũng hữu ích vì bây giờ mã đằng sau có thể truy cập các giá trị của các điều khiển này trên biểu mẫu web asp.net của bạn với intellisense.

Đối với việc đăng lên cùng một trang, có, nút "gửi" sẽ đăng lên một trình xử lý sự kiện trên mã phía sau của trang. Tùy thuộc vào trình xử lý sự kiện trong mã phía sau để chuyển hướng đến một trang khác nếu cần (hoặc gửi thông báo lỗi đến trang của bạn hoặc bất cứ điều gì khác bạn có thể cần làm).


8

Định nghĩa của Wikipedia về postback là khá tốt, nhưng tôi muốn thêm điều sau: Postback là một HTTP POST tiếp theo đến cùng một trang có biểu mẫu.

Nếu tôi có một trang có biểu mẫu trên đó và thay vì để nút Gửi của tôi chuyển hướng trình duyệt đến một trang khác sẽ xử lý biểu mẫu, thay vào đó hãy để nút Gửi làm mới trang hiện tại (và thực hiện một số bước cụ thể để xác thực / lưu trang, có lẽ), thì nút Gửi đó được cho là đã đăng trở lại trang hiện tại.

Đăng lại có thể là toàn bộ (làm mới toàn bộ trang) hoặc một phần (trong trường hợp AJAX được sử dụng). Việc đăng lại một phần trang sẽ chỉ hiển thị lại một phần của trang (như một danh sách thả xuống, một bảng, v.v.).


4

Trong HTML cũ, cách duy nhất để cập nhật nội dung nào đó trên trang web là gửi lại trang web mới cho trình duyệt khách. Đó là những gì ASP đã từng làm, bạn phải làm điều này gọi là "PostBack" để gửi một trang cập nhật cho khách hàng.

Trong ASP .NET, bạn không cần phải gửi lại toàn bộ trang web. Bây giờ bạn có thể sử dụng AJAX hoặc các điều khiển ASP.NET khác để bạn không phải gửi lại toàn bộ trang web.

Nếu bạn truy cập một số trang web cũ, bạn sẽ nhận thấy rằng một khi bạn nhấp vào một thứ gì đó, toàn bộ trang phải được làm mới, đây là ASP cũ. Trong hầu hết các trang web hiện đại, bạn sẽ nhận thấy trình duyệt của mình không phải làm mới toàn bộ trang mà chỉ cập nhật phần nội dung cần cập nhật. Ví dụ: trong Stackoverflow, bạn thấy trang chỉ cập nhật nội dung chứ không phải toàn bộ trang web.


Điều đó có phần đúng, nhưng có lẽ hơi sai lệch. Đăng lại của asp.net tiêu chuẩn NÊN gửi toàn bộ trang, cộng với dạng xem, trở lại máy chủ và làm mới toàn bộ trang. AJAX đã làm cho điều này đẹp hơn một chút với khả năng chỉ đăng lại các phần của trang.
— Scottie

3

Đơn giản chỉ cần đặt điều này bằng một đoạn mã nhỏ. Hy vọng nó hữu ích cho bạn. Khi bạn lần đầu tiên yêu cầu url trang. bạn có thể xem mã nguồn của nó trong hầu hết các trình duyệt. Dưới đây là một mẫu của nó.

Điều cơ bản của Post Back thực sự là gọi __doPostBackcái gửi tất cả dữ liệu biểu mẫu nhận được từ yêu cầu đầu tiên của bạn trở lại máy chủ. ( __EVENTTARGETchứa id của điều khiển.)

<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>

2

Đăng lại là một yêu cầu trong đó ASP khôi phục các giá trị thuộc tính của điều khiển từ trạng thái xem.


1

IsPostBacklà một thuộc tính của Asp.Nettrang cho biết trang đó có hay không on its initial loadvà liệu người dùng có thực hiện một nút trên trang web của bạn khiến trang đăng trở lại chính nó hay không.

thêm về ... Asp.Net ispostback ()

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.