2009-07-07 38 views
8

Tôi không biết nhiều về ASP.Net nhưng tôi đang cố gắng tạo một điều khiển mới cho hộp thư. Bạn nhập một số thông tin và nhấn một nút.ASP.Net: Page_Load() được gọi nhiều lần

Tuy nhiên, đối với một số lý do kỳ lạ khi nhấn nút, Page_Load() được gọi là lần thứ hai và tất cả các biến thành viên được đặt lại thành null! Tôi cần những biến đó, và Page_Load() không có lý do để được gọi là lần thứ hai! Tất nhiên callstack là vô ích.

+0

Tại sao ngăn xếp cuộc gọi vô dụng? Vui lòng đăng một bản sao của nó để chúng tôi có thể xem ai đã bắt đầu cuộc gọi đến phương thức tải của bạn. –

+0

Bạn có javascript thực hiện cuộc gọi webmethod không? – NotMe

+0

Tất cả hiển thị trên Page_Load() là [Mã bên ngoài] – evilfred

Trả lời

16

Hãy nhớ rằng, trong ASP.Net mỗi khi bạn gây ra một postback của bất cứ loại nào, bao gồm cả xử lý các sự kiện như nhấp chuột vào nút, bạn đang làm việc với một thương hiệu trường hợp mới của lớp trang của bạn phải được xây dựng lại từ đầu. Bất kỳ công việc nào bạn đã thực hiện trước đây để xây dựng trang trên máy chủ là đã biến mất. Điều đó có nghĩa là chạy toàn bộ vòng đời trang toàn bộ, bao gồm mã tải trang của bạn và không chỉ mã nhấp chuột.

Luôn có hai, không, không ít hơn. Yêu cầu và phản hồi.

+1

guhhh vì vậy các biến mẫu là vô ích? điều này là lạ bởi vì tôi đã làm chính xác cùng một công cụ ở những nơi khác trong trang web và họ làm việc tốt, tôi đã không xảy ra để nhấn tái instantation có bằng cách nào đó tôi đoán. – evilfred

+1

Biến thể hiện hữu ích khi giữ dữ liệu ở giữa các sự kiện trong cùng một bài đăng. Ví dụ: bạn có thể mở kết nối sql sớm và sử dụng cùng kết nối đó sau trong vòng đời. Trong trường hợp các biến mẫu hoạt động ở nơi khác trên các postback, bạn có thể dựa vào ViewState. –

+0

+1 để suy nghĩ về * điều rõ ràng nhất * đầu tiên thay vì trải qua những suy đoán tiên tiến hơn! –

4

Khi trang đăng lại, phương thức Page_Load được gọi. Sau đó, khi máy chủ thực sự xử lý trang và gửi cho bạn một trang mới dựa trên các thay đổi, Page_Load được gọi lại, thực sự là lần đầu tiên trên trang mới được gửi cho bạn.

Vì vậy, nếu bạn đang kéo dữ liệu trong sự kiện Page_Load hoặc thiết lập một số giá trị, đặt nó bên trong khối sau:

if(!Page.IsPostBack) 
{ 

} 

để bảo tồn một số tiểu bang của bạn. Nếu không, các hướng dẫn mà bạn đưa vào sự kiện Page_Load sẽ thực thi mọi lúc.

Nó giúp để xem lại vòng đời trang ASP.Net :)

0

Chỉ cần một shot trong bóng tối nhưng có lẽ thêm này sau khi Page_Load của bạn:

if (!IsPostBack) 
{ 
1

Như Joel đã đề cập, các instance variable sẽ bị mất một lần trang được gửi trả lại cho khách hàng. Tuy nhiên, có nhiều phương pháp lưu trữ các giá trị của các biến của bạn để bạn có thể truy xuất chúng sau này. Trang này trên State Management là điểm khởi đầu tốt nếu bạn muốn tìm hiểu thêm.

1

Bất kỳ thẻ/yếu tố nào yêu cầu tham chiếu url như img, neo, đối tượng, v.v ... đều phải được chọn cho tham chiếu trống.

ví dụ: href = "", url = "", src = "" là một số lỗi phổ biến.

1

Mã này làm việc cho tôi:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     if (Session["something"] == null) 
     { 
      Session["something"] = "1"; 
     } 
     else 
     { 
      Session["something"] = null; 

      //your page load code here 

     }    
    } 
} 
1

Đối với tôi, vấn đề này là một chút phức tạp, nhưng tôi thấy rằng xử lý

protected override void OnPreRender(EventArgs e)

chỉ được gọi một lần, vì vậy nó an toàn hơn để đặt một số hành động trong đó nếu nó không quá muộn trong đường ống cho bạn.

-1

bạn có thể sử dụng phiên hoặc ViewState để giữ lại giá trị của biến ..

  1. nếu bạn muốn chuyển hướng đến một trang khác, phiên sử dụng []
  2. khác nếu bạn muốn ở lại trên cùng trang, sử dụng viewstate []
Các vấn đề liên quan