2011-02-16 68 views
0

我已經構建了一個ascx控件,它是我的應用程序的許多不同組件的一部分。在這個控件上有一個Previous和Next按鈕,它應該被傳遞給父aspx頁面。這是通過讓父頁面添加一些代表用於回發,例如OnPreviousClicked,OnNextClicked等。代表,UpdatePanels和ascx控件

此應用程序中的所有內容都與updatepanel一起被「Ajax化」。現在我注意到,如果我沒有在父代中的每個Page_Load調用上設置代理,我的應用就會中斷。換句話說,如果我不總是將代理設置在父aspx的Page_Load中,那麼ascx最終會以null委託和異常結束。我是否正確地編碼了東西?

回答

1

記住每個回發必須重新啓動您的代碼。事件處理程序不會被序列化爲viewstate,因此您必須重新設置它們。

+0

通過「重新啓動您的代碼」,您的意思是再次瀏覽頁面生命週期,對吧? – 2011-02-16 22:27:57

+0

是的,它必須再次經歷整個週期。 – 2011-02-16 22:34:08

2

如果你所做的只是點擊一個按鈕,我會讓你的ASCX控件提出一個簡單的事件。這樣,每個頁面都可以監聽事件,如果需要的話,無論有人在監聽,控件都可以運行。

首先聲明的事件在你的ASCX代碼隱藏:

public event System.EventHandler NextSelected; 

然後創建引發事件的按鈕單擊事件。

protected void btnNextSelected_Click(object sender, EventArgs e) 
{ 
    if (EmployeeSelected != null) 
    { 
     NextSelected(this, new EventArgs()); 
    } 
} 

然後在你的父母ASP.Net頁面,您可以添加您的ASCX控制(我們就叫它NavControl),並創建一個偵聽這些事件的方法。

NavControl.NextSelected += new EventHandler(NextPageRedirect); 

protected void NextPageRedirect(object sender, EventArgs e) 
{ 
    Response.Redirect("~/ViewEmployee.aspx", false); 

} 

請注意,這個你不必創建事件處理程序或方法,你仍然可以使用你的頁面上的導航控制。它還應該消除你與代表們遇到的問題。

1

這是asp.net中的預期行爲。

即使是部分回發(更新面板),也會發生整個page life cycle。因此,爲了讓事件觸發,您必須在page_load期間以編程方式將它們連接起來,或者在標記中聲明式地連接它們(如果您提到的那些代表是事件)。

2

//控制裏面

public event EventHandler OnPreviousClicked; 

private void PreviousButton_OnClick(object sender, EventArgs e) 
{ 
    if(OnPreviousClicked != null) { 
    OnPreviousClicked(this, e); // or whatever args you want 
    } 
} 

//和內頁的代碼隱藏

private void Page_Load(...) 
{ 
    MyUserControl.OnPreviousClicked += new EventHandler(myHandler); 
} 

//或頁面內ASPX,你也可以只設置OnPreviousClicked屬性。

<xx:MyUserControl ID="MyUserControl1" runat="server" OnPreviousClicked="myHandler" /> 

請參閱http://asp.net-tutorials.com/user-controls/events/