欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET页面借助IFrame提交表单数据所遇到问题的解决方法分享

程序员文章站 2024-03-07 17:21:09
首先看下面的代码片段,我们希望用户在点击页面上的button时首先将数据提交到指定的第三方页面,然后再执行后台的page_load事件。 复制代码 代码如下:
首先看下面的代码片段,我们希望用户在点击页面上的button时首先将数据提交到指定的第三方页面,然后再执行后台的page_load事件。
复制代码 代码如下:

<body>
<iframe id="webgatewaysubmissionprocessor_iframe" name="webgatewaysubmissionprocessor_iframe" style="display: none;"></iframe>
<form onsubmit="javascript:if (typeof webgatewaydoublesubmission != 'undefined') {webgatewaydoublesubmission(this);}" id="form1" runat="server">
<div id="page">
<asp:button id="btnclientsend" runat="server" />
</div>
<script type="text/javascript" id="webgatewayscript">
webgatewaydoublesubmission = function(o) {
var oldaction = o.action;
var oldonsubmit = o.onsubmit;
var oldtarget = o.target;
var oldmethod = o.method;
var iframesubmisiontarget = document.getelementbyid("webgatewaysubmissionprocessor_iframe");
var submitpostiframesubmission = function() {
o.action = oldaction;
o.target = oldtarget;
o.method = oldmethod;
o.onsubmit = oldonsubmit;
o.submit();
};
/*iframesubmisiontarget.onload = submitpostiframesubmission;*/
eventpush(iframesubmisiontarget, 'load', submitpostiframesubmission);
o.action = "http://webgateway.hostedmscrm.com/v2/formprocessor.aspx";
o.target = "webgatewaysubmissionprocessor_iframe";
o.onsubmit = null;
o.method = "post";
o.submit();
};
webgatewaysubmission = function(o) {
o.action = "http://webgateway.hostedmscrm.com/v2/formprocessor.aspx";
o.method = "post";
};
function eventpush(obj, event, handler) {
if (obj.addeventlistener) {
obj.addeventlistener(event, handler, false);
} else if (obj.attachevent) {
obj.attachevent('on' + event, handler);
}
}
</script>
</form>
</body>

form中的onsubmit事件在页面被提交时触发,此时首先执行webgatewaydoublesubmission脚本方法,在该方法中,将当前form的action,onsubmit,target,method缓存到指定的变量中,然后将form的action和target指向另一个页面进行提交,此时页面上的数据被post到第三方页面。然后再使用页面上隐藏的iframe来调用submitpostiframesubmission方法,并将原先的form进行提交。这里有一个问题,在上面的代码中有一行被注释掉了,原因就是直接使用iframe的onload方法并不能触发该事件,从而导致submitpostiframesubmission方法不能执行,页面的第二次提交不成功!使用eventpush方法可以有效地解决该问题。
同时,在服务端的page_load事件中,需要使用ispostback来判断页面是否被提交了:
复制代码 代码如下:

protected void page_load(object sender, eventargs e)
{
if (page.ispostback)
{
//todo:
}
}

相关资料:
http://www.4ucode.com/study/topic/1087401 
http://wiki.operamasks.org/pages/viewpage.action?pageid=1835020