Sys.Application.add_load问题与模态弹出窗口扩展程序有关。

3

我是一个有用的助手,可以帮助您翻译文本。

我有一个当前的问题,在解释上下文之前:

我有一个包含表单的模态弹出框扩展程序。有一个“保存并添加新项”的功能,当用户点击此按钮时,在回发期间将表单中的数据保存到数据库中,并重新加载页面。

我希望在页面加载时再次出现这个模态弹出框,允许用户输入新数据,而不必再次点击显示该模态弹出框的按钮。

我首先尝试以以下方式调用它:

ClientScript.RegisterStartupScript(Page.GetType(), "ModalPopup", "ShowModalPopup(""" & Me.formModalButton.ID & """);", True)

但问题在于当该函数被调用时,我的模态框弹窗还不存在于页面上。因此,代码在

处崩溃。
var modal = $find('myModal');

所以,我找到了另一种方法,它几乎完美地工作。
ClientScript.RegisterStartupScript(Page.GetType(), "ModalPopup", "Sys.Application.add_load(function() {ShowModalPopup(""" & Me.formModalButton.ID & """)};", True)

模态框在页面加载时按照我的意愿出现了,但问题是如果我点击页面上的任何其他按钮,模态框也会再次出现。
例如:我有另一个用于删除数据的模态框,在我点击该按钮时,两个模态框都会出现,这不好。
有人知道如何解决这个问题或更好的方法吗?
附言:我没有在服务器端调用模态框弹出窗口,因为JavaScript函数存在于页面中,所以我不想在RegisterStartupScript中创建该函数的副本。
感谢您的时间。
2个回答

2
请使用以下代码片段。
//Declares gloabal variable
ClientScript.RegisterStartupScript(Page.GetType(),"vardeclaration","var reloadModal;",true);

ClientScript.RegisterStartupScript(Page.GetType(), "ModalPopup", "Sys.Application.add_load(

function() 
{
   reloadModal = function() {ShowAddModalPopup(""" & Me.imgAdd.ID & """);};
   Sys.Application.add_init(reloadModal);
}
);", True)

这将使您能够使用:
function cancelClick()
{
   Sys.application.remove_init(reloadModal);
}

你好,首先感谢您的回复。不幸的是,如果我使用Sys.Application.add_init而不是add_load,我仍然会遇到之前的问题,即当调用函数时,我的模态弹出窗口扩展程序不存在,因此我会在$find('myModal')上得到一个空引用异常。 - ForceMagic
是的,我可以做到,但问题仍然存在,一旦脚本被注册。也许我应该尝试在取消按钮上卸载。使用Sys.application.remove_load。实际上,当用户点击取消时,脚本仍然存在,因此当页面上发生单击时,模态框会再次弹出。 - ForceMagic
是的,我仍然卡在第一次调用后“删除”存储函数上。我的意思是,当他在页面加载时再次向我显示模态弹出窗口时,如果我点击取消,脚本会停留在那里,任何其他点击都会再次出现。你想让我发布我的代码以查看是否可以帮助你吗?谢谢。 - ForceMagic
你好!我有一个坏消息和一个好消息 :P好消息是,你的代码运行良好!我学会了如何声明全局函数。坏消息是,即使我调用remove_init(reloadModal),在点击其他按钮时仍然存在相同的行为。也许这不是我所需要的好方法? - ForceMagic
这是我能想到的唯一可能。也许,我的自定义JavaScript与ScriptManager生成的当前JavaScript发生了一些“干扰”。实际上,即使在Forums.Asp.Net上,我也没有看到有人像我这样频繁地使用模态弹出窗口,并且定制得如此之多。我真的一点头绪都没有 :( - ForceMagic
显示剩余5条评论

2
最终,我找到了解决当前问题的方法。
我仍然使用ClientScript.Resgister[...],但这次我还更改了取消按钮的OnClientClick JavaScript函数。
因此,当用户选择“保存并添加新内容”功能时,如果页面重新加载并且模态框再次显示,则如果单击“取消”按钮,我会向服务器发出一个postback以重新加载页面并解决那些奇怪的行为。
我也认为,问题可能存在于代码中不同的Update Panel,但我需要它们来使Modal Popup Extender正常工作。
无论如何,我发现它甚至在Opera和Safari中都不能正常工作,但整个事情(Ajax Control toolkit - Modal popup extender)都是这样。很幸运,公司并不关心其他浏览器,并且只正式支持IE。在我的情况下,我至少想让它在FF和Chrome中正常工作。
ClientScript.RegisterStartupScript(Page.GetType(), "ModalPopup", "Sys.Application.add_load(function() {ShowAddModalPopup(""" & Me.imgAdd.ID & """)});", True)
                btnCancel.OnClientClick = "resetDefaultValue();__doPostBack('" & btnCancel.ID & "','onclick')"

这里有一段代码,在FF中出现了另一个错误,

Sys.WebForms.PageRequestManagerServerErrorException: 在服务器处理请求时发生未知错误。从服务器返回的状态代码为:0

我找到了一个解决方法,虽然不是最好的,但我已经花了足够多的时间在这上面了...

ClientScript.RegisterStartupScript(Page.GetType(), "WorkAroundFF", "Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest); function endRequest(sender, args) { /* Check to see if there's an error on this request.*/ if (args.get_error() != undefined) { $get('Error').style.visibility = ""visible""; /* Let the framework know that the error is handled, so it doesn't throw the JavaScript*/ alert. args.set_errorHandled(true); } }", True)

感谢你的帮助,Ramesh。我相信你的解决方案可以有效,如果不是我的更新面板引起的问题。
希望这能帮助其他人。

其实,我也认为我仍在使用框架2.0的VS2005可能会引起更多麻烦。我们的Ajax控件工具包不是最新版本,所以我想我会暂时禁用该功能,并稍后在VS2008上进行测试,因为我有其他类型的错误,我确定这是他们的问题。 - ForceMagic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接