客户端验证prvent手动回发JavaScript eval()

时间:2010-03-08 11:28:04

标签: c# asp.net javascript postback client-side-validation

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

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

祝你有个愉快的一天。期待很快收到你的消息。

1 个答案:

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

我无法模拟您的案例,但如果您可以发布完整的代码示例,则可以帮助我找出问题。