2

我在使用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 对话框,然后选择一些用户,然后再次单击选择按钮)。它能够进行手动回发....而且我不明白为什么第一次不起作用。

这真的让我发疯了,希望这里的任何人都可以提供帮助,将不胜感激。非常感谢你们。:)

祝你今天过得愉快。期待很快收到大家的来信。

4

1 回答 1

1

当你调用__doPostBack(eventTarget, eventArgument)一个表单提交时触发:

如果WebForm_OnSubmit();返回 true,则此来自 post 的内容将继续。

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,它与验证标注无关。

我无法模拟您的情况,但如果您可以发布完整的代码示例,它将帮助我找到问题所在。

于 2010-06-02T10:59:05.213 回答