问题如下:
我在UserControl_2中有一个UserControl_1,UserControl_1有一个由UserControl_2订阅的事件。在UserControl_1中单击按钮时会触发此事件。
当用户手动点击此按钮时,一切正常,并且事件很好地路由到UserControl_2中的处理程序,但,当通过jQuery单击此按钮时,事件未被路由到UserControl_2。
问题是,在调用UserControl_1中的按钮处理程序这一事实时,当尝试将事件路由到UserControl_2时,处理程序为空,就像没有控件订阅它一样。
在UserControl_1中路由/冒泡事件的代码如下:
public event MyFileUploadCommandEventHandler UploadDone;
protected virtual void OnUploadDone(MyFileUploadCommandEventArgs e)
{
if (UploadDone != null)
{
UploadDone(this, e);
}
}
这里,当通过点击jQuery调用时,UploadDone处理程序始终为null。
我的jQuery方法我已经用两种方式进行了测试,结果相同:
function DoneCallback() {
$("[id*='btnDoneCallback']").click();
}
和
function DoneCallback() {
__doPostBack('<%=btnDoneCallback.UniqueID%>', '');
}
用户点击和导致此行为的jQuery点击事件有什么区别?
谢谢!
答案 0 :(得分:2)
我通过将控件的id作为javascript函数的参数传递来解决它:
function DoneCallback(ctl) {
var id = '#' + ctl;
$(id).click();
}
并将其称为:
<div onclick="javascript:DoneCallback('<%=btnDoneCallback.ClientID%>');">CLICK ME!</div>
感谢您的帮助!
答案 1 :(得分:0)
我认为您需要在jquery-click-function中找到该表单,然后提交它;类似的东西:
$(this).parents("form:first").submit();
实际上,那是错的。你很可能需要执行那些asp.net希望用服务器上的相应事件处理程序连接点击的JS。要在服务器上生成此类JS(以便客户端执行),您可以使用以下方法:
this.Page.ClientScript.GetPostBackEventReference()
this.Page.ClientScript.GetPostBackClientHyperlink()
它们返回您需要呈现给页面的字符串(javascript代码),然后在适当时从您的jquery-click调用它。
答案 2 :(得分:0)
ASP.NET在点击时触发__doPostBack(eventtarget, eventarguments)
功能。我不完全确定为什么在控件上调用.click()
不会传播TBH。但是您应该在用户控件中公开一个属性来公开此函数:
public string ClientPostbackFunction
{
get { return ClientScript.GetPostBackEventReference(Button1, "argument", false); }
}
然后你可以用JQuery绑定它:
$("#button").click(function() { <%= UserControl1.ClientPostbackFunction %> });