gpt4 book ai didi

c# - 客户端验证通过 JavaScript eval() 手动回发

转载 作者:太空宇宙 更新时间:2023-11-03 14:31:58 26 4
gpt4 key购买 nike

我在使用 GetPostBackEventReference 时遇到了一些回发问题。这是场景:

我有一个 javascript 模态弹出对话框,在这个模态对话框中有一个用于选择内容的按钮(这不是 asp:button 控件)

当单击此 javascript 对话框 HTML 按钮时,它将通过 javascript: eval() 方法调用 MS AJAX 网络服务调用。并且此 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 网络服务调用是动态构建的,当构建 MS AJAX 网络服务调用时,它将传递一个包含回发值的 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)的点击事件绑定(bind)到 asp:hiddenfield,并设置 registerForEventValidation 参数为 false。我也曾尝试使用不同的 ValidationGroup 并将 CausesValidation 设置为 false,但没有希望。 :(

总而言之,我将 asp:button 的 Click PostBackEventReference(即 __doPostback(....))绑定(bind)到 asp:hidden 字段的 Value 属性,并使用 javascript eval() 来评估这个隐藏的字段的值,以便手动触发回发。

附注btnSelectUser 是一个 asp:button 控件,用于调出 javascript 模式对话框。

好的,问题来了:

在同一页面中,有一些 asp:validator,例如并且,当然,当页面遇到错误时,此验证器和标注将显示给用户。例如当用户没有填写任何内容并提交表单时,ValidatorCalloutExtender 将显示一个气球并告诉用户。想象一下,此时其中一个气球/验证器 CalloutExtender 出现在您的屏幕顶部。

然后单击 btnSelectUser (asp:button) 以显示 javascript 模式对话框,并在对话框中添加一些用户,一旦您点击此模式对话框内的 SELECT 按钮,就会触发 MS AJAX Web 服务,如下所示上面提到的,一旦此 Web 服务完成,它就会 eval() asp:hidden 字段的值(即 __doPostback(...))......并手动执行回发。

但是,由于 validatorCalloutExtender 气球已经显示,它无法以这种方式触发回发,但是当我关闭气球/validatorCalloutExtender 时,使用 eval() 的手动回发工作正常。更奇怪的是,当显示气球时,我第一次单击此模式对话框中的 SELECT 按钮时,它不会触发回发,但是,如果我再次做同样的事情(即打开 javascript 对话框,并且选择一些用户,然后再次单击 SELECT 按钮)。它能够进行手动回发....我不明白为什么第一次不起作用。

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

祝你有美好的一天。希望尽快收到大家的来信。

最佳答案

当您调用 __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,它与处理验证标注。

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

关于c# - 客户端验证通过 JavaScript eval() 手动回发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2400897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com