我在使用GetPostBackEventReference时遇到了一些回发问题。这是场景:
我有一个 javascript 模态弹出对话框,并在这个模态对话框中有一个用于选择内容的按钮(这不是asp:button 控件)
单击此 javascript 对话框 HTML 按钮时,它将通过javascript: eval()方法调用 MS AJAX Web 服务调用。这个 MS AJAX Web 服务调用是动态生成的。所以代码是这样的:
var serviceCall = svcCall + "(" + parameters + ")"; //dynamically generate the MS AJAX web service call here
eval(serviceCall);
//use eval to trigger the MS AJAX web service call
众所周知,在完成 MS AJAX Web 服务后,您可以定义一个回调函数来处理完成:
function OnComplete(result, userContext, methodName) {
//force to call postback manually
eval($(userContext[0]).val());
//close the javascript dialog here
}
正如我之前提到的,MS AJAX Web 服务调用是动态构建的,当构建 MS AJAX Web 服务调用时,它将传递一个包含回发值的 userContext(即“ __doPostBack('ctl00$ContentPlaceHolder1$btnSelectUser' ,'') ",所以当调用 javascript eval()时,它会模拟一个 asp:button 点击回发。
userContext[0] 基本上保存了一个 asp:hidden 字段的 ClientID,并且在 Page_Load 事件期间设置了隐藏字段的值:
protected void Page_Load(object sender, EventArgs e)
{
btnSelectUser.ValidationGroup = "popupSelect";
btnSelectUser.CausesValidation = false;
this.hdnBtnPostback.Value = Page.ClientScript.GetPostBackEventReference(btnSelectUser, string.Empty, false);
}
如您所见,这就是我使用GetPostBackEventReference将 asp:button(即 btnSelectUser)的 Click 事件绑定到 asp:hiddenfield并将registerForEventValidation参数设置为 false 的方式。我也尝试使用不同的ValidationGroup并将CausesValidation设置为false,但没有希望。:(
总之,我将 asp:button 的 Click PostBackEventReference(即 __doPostback(....))绑定到 asp:hidden 字段的 Value 属性,并使用 javascript eval() 评估此隐藏字段的值以手动触发回发。
ps btnSelectUser 是一个 asp:button 控件,用于调出 javascript 模式对话框。
好的,这是问题:
在同一页面中,有一些 asp:validator,例如 and ,and ,当页面出错时,该验证器和标注将显示给用户。例如,当用户没有填写任何内容并提交表单时,ValidatorCalloutExtender 将显示一个气球并告诉用户。想象一下,此时其中一个气球/验证器CalloutExtender 出现在您的屏幕顶部。
然后单击 btnSelectUser (asp:button) 以显示 javascript 模态对话框,并在对话框中添加一些用户,一旦在此模态对话框中单击 SELECT 按钮,就会触发 MS AJAX Web 服务,如上所述,一旦这个 Web 服务完成,它会 eval() asp:hidden 字段的值(即 __doPostback(...))......并手动进行回发。
但是,由于validatorCalloutExtender气球有显示,它无法以这种方式触发回发,但是当我关闭气球/validatorCalloutExtender时,使用eval()的手动回发工作正常。更奇怪的是,当气球显示时,我第一次单击此模式对话框中的 SELECT 按钮时,它不会触发回发,但是,如果我再次执行相同的操作(即打开 javascript 对话框,然后选择一些用户,然后再次单击选择按钮)。它能够进行手动回发....而且我不明白为什么第一次不起作用。
这真的让我发疯了,希望这里的任何人都可以提供帮助,将不胜感激。非常感谢你们。:)
祝你今天过得愉快。期待很快收到大家的来信。