页面内如果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里。
第一种是被动的接收信息,第二种是有交互的通信.