使用 GetPostBackEventReference 时,我会遇到一些回发问题。这是场景:
我有一个javascript模式弹出对话框,在这个模态对话框中有一个按钮,用于选择内容(这是不一个asp:按钮控件)
单击此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:按钮点击回发。
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 论证为假。我还尝试使用不同的 ValidationGroup 并将 CausesValidation 设置为 false ,但没有希望。 :(
总结一下,我将asp:button的Click PostBackEventReference (即__doPostback(....))绑定到asp:hidden字段的Value属性,并使用javascript eval()来评估这个隐藏字段的值,以便手动触发回发。
P.S。 btnSelectUser是一个asp:按钮控件,用于调用javascript模式对话框。
好的,这是问题:
在同一页面中,有一些asp:验证器,例如而且,当页面遇到错误时,该验证器和标注将显示给用户。例如当用户没有填写任何内容并提交表单时,ValidatorCalloutExtender将显示一个气球并告诉用户。想象一下,这个ballon / validatorCalloutExtender中的一个现在出现在屏幕顶部。
然后单击btnSelectUser(asp:按钮)以显示javascript模式对话框,并在对话框中添加一些用户,一旦点击此模式对话框中的SELECT按钮,MS AJAX Web服务将被触发为如上所述,一旦这个Web服务完成,它就会eval()asp:hidden字段的值(即__doPostback(...))......并手动进行回发。
但是,由于validatorCalloutExtender ballon已经显示,它以某种方式不能以这种方式触发回发,但是当我关闭ballon / validatorCalloutExtender时,使用eval()的手动回发工作正常。更奇怪的是,当显示气球时,第一次单击此模态对话框中的SELECT按钮时,它不会触发回发,但是,如果我再次执行相同的操作(即打开javascript对话框,并且选择一些用户,然后再次单击“选择”按钮)。它能够进行手动回发....我不明白为什么第一次不起作用。
这真让我疯狂,希望这里的任何人都可以提供帮助,真的很感激。非常感谢你们。 :)
祝你有个愉快的一天。期待很快收到你的消息。
答案 0 :(得分:1)
当您致电__doPostBack(eventTarget, eventArgument)
时,会触发表单提交:
如果WebForm_OnSubmit();
返回true,将从帖子开始。
WebForm_OnSubmit
结果取决于ValidatorOnSubmit
结果,而结果又取决于
ValidatorCommonOnSubmit
会产生Page_ValidationActive == true
。
现在如果你还在我身边,就像在下面的函数中一样:
function ValidatorCommonOnSubmit() {
Page_InvalidControlToBeFocused = null;
var result = !Page_BlockSubmit;
if ((typeof(window.event) != "undefined") && (window.event != null)) {
window.event.returnValue = result;
}
Page_BlockSubmit = false;
return result;
}
ValidatorCommonOnSubmit
的结果取决于Page_BlockSubmit
,因此阻止回发的唯一方法是Page_BlockSubmit == true
,它与验证标注无关。
我无法模拟您的案例,但如果您可以发布完整的代码示例,则可以帮助我找出问题。