頁面內如果include了UserControl的話,頁面與UserControl的通訊是開發過程中不可避免的問題。
因爲asp.net中,頁面的加載順序是:
1 aspx頁面的Page_Load
2 userControl的Page_Load
所以頁面傳遞參數給userControl可以將變量存放在SESSION中。
所以關鍵是UserControl如何將信息傳遞給頁面。
有兩種實現方式:
1) 在aspx頁面中加一個load函數,當頁面onload事件發生時調用。load函數解析HTML DOM,得到UserControl中的元素的value,這個value的值可以由UserControl來控制。
function load()
{
var divContent = document.getElementById('divContent');
elements = divContent.getElementsByTagName("span");
var str = "";
for(var p in elements){
str = ""+elements[p].innerHTML;
if( str.indexOf("IsChkSucc") > 0 ){
var leftpad = str.indexOf("value");
var value_IsChkSucc = str.substr(leftpad+6,3);
//alert(value_IsChkSucc);
if(value_IsChkSucc == "SUC"){
document.getElementById('btnUp').style.display='';
}
else if(value_IsChkSucc == "ERR"){
document.getElementById('btnUp').style.display='none';
}
}
}
}
2) 使用自定義事件
public delegate void MessageNotifiedEventHandler(Object sender, UserEvent.UserControlEventArgs e);
public partial class UserControls_UploadFile : UserControls_BaseUpload
{
public event MessageNotifiedEventHandler MessageNotified;
protected void btnUpload_Click(object sender, EventArgs e)
{
//taskA
if (MessageNotified != null)
{
// UserControlEventArgs是一個繼承EventArgs有類
UserControlEventArgs ucEventArgs = new UserControlEventArgs();
ucEventArgs.fileName = strFilePath;
ucEventArgs.checkErr = (failCnt > 0);
ucEventArgs.rowFieldNum = rowFieldNum;
MessageNotified(this, ucEventArgs);
}
}
// taskC
}
在頁面的Page_Load中訂閱這個事件。
upload.MessageNotified += new MessageNotifiedEventHandler(upload_MessageNotified);
private void upload_MessageNotified(object sender, UserControlEventArgs e)
{
try
{
// taskB
}
catch (Exception ex)
{
AlertExceptionMessage(ex);
}
finally
{
ExcuteJsFinally();
}
}
上述代碼的執行順序是:
頁面Page_Load(含訂閱事件代碼),UC Page_Load, UC處理點擊事件,UC拋出自定義事件,頁面處理訂閱事件,UC繼續執行點擊事件後續處理,傳遞給頁面的參數被定義在UserControlEventArgs裏。
第一種是被動的接收信息,第二種是有交互的通信.