2008-09-02 12 views

Trả lời

6

Một cách để bạn có thể làm điều đó là để dây lên một handler Application.Load trong Application.Init, sau đó có handler mà unbind bản thân sau khi chạy:

Sys.Application.add_init(AppInit); 

function AppInit() { 
    Sys.Application.add_load(RunOnce); 
} 

function RunOnce() { 
    // This will only happen once per GET request to the page. 

    Sys.Application.remove_load(RunOnce); 
} 

Đó sẽ thực hiện sau khi Application.Init. Nó sẽ là điều cuối cùng trước khi pageLoad được gọi.

2

Bạn có thể có một đầu vào ẩn mà bạn thiết lập một giá trị nổi tiếng ở phía máy chủ nếu đó là một postback/callback - và javascript của bạn có thể kiểm tra giá trị đó.

Điều đó nói rằng, tôi thực sự hy vọng rằng có giải pháp chỉ dành cho khách hàng cho việc này.

Chỉnh sửa: @mmattax - Tôi tin rằng anh ấy đang tìm giải pháp phía máy khách - tương đương với JavaScript.

2

Điều bạn có thể làm là kết nối với sự kiện tải của lớp học Sys.Application. bạn có thể sử dụng thuộc tính isPartialLoad của lớp Sys.ApplicationLoadEventArgs. Tôi tin rằng sẽ cho bạn biết nếu bạn đang ở trong một postback không đồng bộ hay không.

Để biết nếu bạn đang ở trong một bài đăng trở lại, bạn sẽ phải xử lý điều đó trong mã phía máy chủ và phát ra điều đó cho khách hàng.

0

Bạn vẫn có thể sử dụng Page.IsPostback khi đang có cuộc gọi không đồng bộ.

3

@ Darren: Cảm ơn bạn đã trả lời. Tôi đã cố gắng tạo pageLoad với đối số sự kiện ApplicationLoadEventArgs làm tham số (xem bên dưới). Tuy nhiên theo this:

Sự kiện tải được tăng cho tất cả các lần đăng lại máy chủ, bao gồm cả postback không đồng bộ.

Như bạn đã chỉ ra, thuộc tính isPartialLoad không bao gồm tất cả các trường hợp postback. Sẽ rất tuyệt nếu đối số sự kiện cũng chứa thuộc tính isPostback.

function pageLoad(sender, arg) { 
     if (!arg.get_isPartialLoad()) { 
      //code to be executed only on the first load 
     } 
    } 

@mmattax: Tôi đang tìm thuộc tính có thể được gọi từ phía máy khách (javascript).

0

Application.Init có lẽ là sự kiện thích hợp hơn để sử dụng, nếu bạn chỉ muốn mã thực thi trên lần tải đầu tiên.

0

@Dave Ward: Điều này thường hoạt động. Tuy nhiên, mã là để đính kèm sự kiện vào đối tượng hành vi. Bởi vì việc tạo ra các đối tượng hành vi xảy ra trong Application.Init, gắn liền với sự kiện đó sẽ dẫn đến hành vi không thể đoán trước.

Sẽ rất tuyệt nếu có sự kiện PostInit.

0

@Dave Ward: Việc sử dụng phương pháp RunOnce hoạt động hoàn hảo.Điều này giải quyết vấn đề của tôi mà không có cách giải quyết để kiểm tra đầu tiên nếu trình xử lý đã tồn tại trước khi đính kèm vào một sự kiện.

Tôi sẽ đánh dấu câu trả lời của bạn là câu trả lời được chấp nhận. Cảm ơn một lần nữa.

0

Đây là Ajax tương đương với isPostback mà chúng tôi đã sử dụng trong một thời gian.

public static bool isAjaxRequest(System.Web.HttpRequest request) 
    {//Checks to see if the request is an Ajax request 
     if (request.ServerVariables["HTTP_X_MICROSOFTAJAX"] != null || 
      request.Form["__CALLBACKID"] != null) 
      return true; 
     else 
      return false; 
    }