2009-09-01 26 views
5

Tôi có một nút mà các cuộc gọi chức năng A()Gọi một hàm trước khi Page_Load

Khi tôi bấm vào nó tôi muốn các cuộc gọi được thực hiện theo thứ tự:

Ngay bây giờ nó đang làm:

Page_Load() 
A() 

Có cách nào xung quanh đó hay chỉ là do thiết kế và tôi không thể làm gì được?

Trả lời

15

Cách dễ nhất để làm điều này sẽ được sử dụng một HTML nút Submit và kiểm tra để xem nếu nó là trong Form trên mỗi postback trong Page_Init

public void Page_Init(object o, EventArgs e) 
{ 
    if(!string.IsNullOrEmpty(Request.Form["MyButtonName"])) 
    { 
      A(); 
    } 
} 

và trong mã ASP.NET của bạn:

<Button Type="Submit" Name="MyButtonName" Value="Press Here To Do Stuff Early!" /> 

tôi nghĩ sẽ hoạt động.

+2

I 'm vua của các khó chịu hack. –

+0

Thật khó chịu nhưng tôi thích nó! 1 quá và nếu nó hoạt động và không có gì sạch hơn đi lên tôi sẽ chấp nhận rằng – marcgg

+0

Bạn có thể cung cấp cho Rune FS một tình yêu upvote chút ... ông đã về mặt kỹ thuật một vài giây trước khi tôi với cùng một câu trả lời. –

5

Bạn cần gọi hàm của mình trong Page_Init. Page_Init sẽ xảy ra trước Page_Load.

Đây là Overview of the ASP.NET Page Lifecycle.

+2

Nhưng tôi muốn chức năng của mình được gọi khi bạn nhấn nút chứ không phải trên mọi lần tải trang. – marcgg

+0

Cảm ơn bạn đã trả lời, nhưng tôi đã kiểm tra liên kết của bạn, điều này thực sự không muốn tôi đang tìm kiếm. Tôi đang cố gắng làm một cái gì đó khi một nút được nhấn. Tôi không chắc chắn làm thế nào để làm điều đó với các thông tin bạn đặt ở đây. – marcgg

+1

Anh ấy không muốn gọi bất kỳ phương thức nào mà anh ấy muốn xử lý sự kiện được gọi trước page_load –

3

Không chính xác: ASP.NET sẽ luôn gọi Page_Load trước khi xử lý các sự kiện postback như Button_Click.

Tuy nhiên, bạn có thể thực hiện những gì bạn muốn bằng cách chuyển hướng đến trang của bạn sau khi xử lý sự kiện postback. (Sử dụng the Post-Redirect-Get pattern.)

Bên trong phương pháp Page_Load của bạn, bạn có thể tránh chạy bất kỳ mã liên quan hai lần bằng cách kiểm tra để xem nếu nó là một postback đầu tiên:

if (!this.IsPostBack) { 
    // Do something resource-intensive that you only want to do on GETs 
} 
1

Tôi không nghĩ rằng nó có thể, ít nhất, không theo cách được mô tả bởi câu hỏi của bạn. Khi bạn bấm vào một nút, nó sẽ gửi một yêu cầu đến máy chủ mà lần lượt sẽ bắt đầu xử lý nó, và theo Vòng đời của ASP.NET như được đăng bởi Joseph.

Hoặc bạn có thể thử thực hiện cuộc gọi AJAX đến trang mà không cần tải lại trang hiện tại bạn đang thực hiện và thực hiện bất kỳ thao tác nào bạn yêu cầu.

+0

Mọi thứ đều có thể ;-) –

+0

Tôi có thể hướng sự chú ý của bạn đến một số kỳ tích không thể nếu bạn muốn, nhưng luôn có lựa chọn thay thế ... :) –

6

Sự kiện kiểm soát (chẳng hạn như các sự kiện nhấp chuột của các nút) được gọi sau page_load. Các điều khiển không được bảo đảm để được khởi tạo đầy đủ trước khi page_load. Nếu bạn thực sự cần gọi hàm trước khi page_load được gọi dựa trên việc nút đã được nhấn bạn sẽ phải kiểm tra yêu cầu kiểm tra xem nút đã được nhấn (về cơ bản ASP cũ)

3

Như Jeff Sternal đã trả lời, mẫu Post-Redirect-Get là một cách tốt để giải quyết vấn đề như thế này.

Trong trường hợp của tôi, tôi đã có lịch và nếu bạn đã nhấp vào ngày, nó sẽ thêm lịch vào bộ lập lịch biểu. Trình lên lịch sẽ có các nút trên mỗi ngày mới cần có các chức năng onclick gắn với chúng.

Vì hàng mới đang được thêm vào bằng một nút liên kết (trên lịch), trong mã, ngày lập lịch mới đã được thêm vào lúc xử lý sự kiện Postback nghĩa là tập hợp các nút mới sẽ không có lệnh gắn với chúng.

The page life Cycle

Post Get Redirect

0

Đây là những gì bạn muốn làm cho trang Init được gọi trước khi tải trang.
Hãy nhìn vào các ASP.net trang Life Cycle

public void Page_Init(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     //CALL YOU FUNCTION A()  
    } 
} 
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 

    } 
} 
0

Nếu mục tiêu thực tế của bạn ở đây là để có "tải trang mã" của bạn xảy ra sau khi xử lý sự kiện của bạn chạy - ví dụ, nếu nhấn nút thay đổi của bạn một cái gì đó trong cơ sở dữ liệu của bạn và bạn muốn dữ liệu cập nhật được phản ánh trên trang khi tải - sau đó bạn có thể có "mã tải trang" được gọi từ phương thức được gọi là sau trong số ASP.NET page life cycle. , chẳng hạn như Page_PreRender, thay vì gọi điện thoại từ Page_Load. Ví dụ, đây là một đoạn trích đơn giản từ một lớp trang .aspx.cs có trình xử lý sự kiện nút chạy trước logic của trang và thông báo xác nhận chỉ hiển thị trên trang sau khi nút được nhấp:

// Runs *before* the button event handler 
protected void Page_Load() { 
    _myConfirmationMessage.Visible = false; 
} 

// Runs *after* the button event handler 
protected void Page_PreRender() { 
    // (...Code to populate page controls with database data goes here...) 
} 

// Event handler for an asp:Button on the page 
protected void myButton_Click(object sender, EventArgs e) { 
    // (...Code to update database data goes here...) 
    _myConfirmationMessage.Visible = true; 
} 
Các vấn đề liên quan