http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 26564|回复: 4

[Asp.Net] asp.net关于页面不回发,不生成__doPostBack方法问题的完美解决方案

[复制链接]
发表于 2013-8-6 17:28:12 | 显示全部楼层 |阅读模式
事件大致如下

这个问题我相信有不少人见过,就是使用系统的分页功能时,或者是使用系统控件,都会有一个回发的功能,这个功能是asp.net自动管理的,就是为了和我们后台的Cs代码连接起来,
但是有时候这个方法并不会生成,正常情况下在页面的Form下面都会生成如下代码
[C#] 纯文本查看 复制代码
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>

但是我发现在一些电脑上,也不知道是什么情况就是没有这两个方法,然后就单击按钮或者是分页时就提示如下
01105404-2875fe57c60d408e98faec323cc2f9d6.jpg
这很明显就是 __doPostBack方法不存在,
ReferenceError:__doPostBack is not defined
ReferenceError:__doPostBack is not defined

我就奇怪了,为什么呢?
而且在这个电脑上的所有浏览器都有一样,IE678 火狐,Google,等都是同样的效果。
着实让人郁闷,所以来博客园请教一下大家看看这种问题应该怎么解决了,
我到是想到一个比较次的方法,只能是在没有找到解决方案之后应的急
代码如下
[C#] 纯文本查看 复制代码
<script type="text/javascript">
       function SetdoPostBack() {
           var html = document.body.innerHTML;
           if (html.toLowerCase().indexOf("dopostback") < 0) {
               var sb = "<script type=\"text/javascript\">";
               sb = sb + "//<![CDATA[";
               sb = sb + "var theForm = document.forms['form1'];";
               sb = sb + "if (!theForm) {";
               sb = sb + "    theForm = document.form1;";
               sb = sb + "}";
               sb = sb + "function __doPostBack(eventTarget, eventArgument) {";
               sb = sb + "    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {";
               sb = sb + "        theForm.__EVENTTARGET.value = eventTarget;";
               sb = sb + "        theForm.__EVENTARGUMENT.value = eventArgument;";
               sb = sb + "        theForm.submit();";
               sb = sb + "    }";
               sb = sb + "}";
               sb = sb + "//]]>";
               sb = sb + "<\/script>";
               document.write(sb);//大家不要管这个,这只是一个输出,正常情况下我是添加到一个Div里的,这里是为了方便查看
           }
   }
   setTimeout('SetdoPostBack()', 2000);//2秒之后开始检查


面的方法要用的话还需要加上两个属性不光是这两个方法没有生成,
__VIEWSTATE等几个hidden控件,因为这个是自动生成的。可这些的生成规则实在是不好处理,不过我发现只要VIEWSTATE有的话另外的两个,只要是生成了,值为Null也不会影响的。
不过这也只是应个急。
还没有想到更好的办法。
希望大家帮忙啊。
根据我的分析,会不会是在某些Ip上在运营商或者是什么地方给屏蔽了一些东西,才使页面不会生成这个方法的。
如果说是浏览器问题那可以排除了,因为我能测试的都测试了,
这问题也不是全部都有,就是有那么几个用户的电脑。
。。。。。。。。

分析

   出现这种问题的关键是什么呢?
我经过查证和咨询总结出来了答案
原因有以下几点,
1.有可能是使用net4.0+iis6之后没有打补丁。
解决办法
在IE10中登录我公司的一个网站时,点击其它菜单,页面总会自动重新退出到登录页,后检查发现,IE10送出的HTTP头,和.AUTH Cookie都没问题,但使用表单验证机制(FormsAuthentication)却无法判断该用户已登入,保存的Session总会丢失.     后查实这是ASP.NET 2.0,3.5和4.0的Bugs,因这些版本无法识别IE10的User-Agent标头字符串,所以无法识别用户浏览器的版本,从而导至了ASP.NET的特定功能失效,认为游览器不支持Cookies功能,不处理与Cookie相关的程式码等,从而在浏览器中不保存服务器返回的Session标识,造成丢失等.
      这个问题早经微软官方确认,是IE10的一个Bug,也发布了两个HOTFIX专门用来修复这个问题,各位如遇到同样的问题,可参考以下说明:

2.简单的解决方法是,在网站根目录,新增一个浏览器定义文件(browser definition file)
     步骤如下:
     1.添加一个"App_Browsers"文件夹
     2.添加一个"*.browser"后缀的文件,如IE10.browser.
     3.添加文件内容如下:
[C#] 纯文本查看 复制代码
<browsers>  

       <browser refID="Default">  

          <capabilities><!-- To avoid wrong detections of e.g. IE10 -->  

             <capability name="cookies" value="true" />  

            <capability name="ecmascriptversion" value="3.0" />  

        </capabilities>  

        </browser>  

       </browsers>

设定完成,问题即可解决,本方法同时也适用于处理asp.net中控件事件回发操作无效问题。
这是网上最常见的一种了,
不过这个方法其实不需要打补丁,只需要设置这App_Browsers个文件夹就行了
我亲自测试过是可以解决问题的
还有一种解决方法就是换控件

这里方法如下
你还在用ASP.NET Web Forms吗?如果在用的话,你可要小心了:
千万不要使用LinkButton控件!
为什么呢?
请看ASP.NET代码:
[C#] 纯文本查看 复制代码
<asp:LinkButton Text="Post" runat="server" id="lbPost"/>

请看运行时的页面HTML代码:
[C#] 纯文本查看 复制代码
<a id="MainContent_lbPost" href="javascript:__doPostBack('ctl00$MainContent$Post','')">Post</a>

问题来了!根据我们遇到的实际情况,某个未知的软件会造成在点击"Post"链接时Javascript代码不能正常执行(可能这个软件是出于安全考虑),引发“WebForm_PostBackOptions is not defined"异常。
这个问题困扰了我们一个多月,问题是多个用户反馈的。而我们无法重现这个问题,解决起来很棘手,最后,一闪而过的想法才让我们猜测到这个原因。
解决方法
弃用asp:LinkButton,改用asp:Button。
该方法已经通过验证,之前遇到这个问题的用户已经确认问题已解决。
由于无法重现这个问题,我们无法找出究竟是哪个未知软件引起的。
小结
问题很简单,解决方法也很简单,但这个问题的现象不具独特性,很费周折,网上一搜索,满网尽是“WebForm_PostBackOptions is not defined",当时找到的觉得稍微有点价值的是WebResource.axd动态压缩可能会引起这个问题,却让我们误入歧途,浪费了很多时间。在几乎绝望,准备用ASP.NET MVC重写整个页面时,问题的线索一下子蹦了出来。那种感觉你懂的!
也许从外人看来程序员性格内向、缺乏情趣,可是他们没有看到程序员在解决问题时眼中放出的光芒,他们也不知道程序员内心所经历的精彩世界!
让他们知道吧,用博客写出程序员的精彩世界!

参考文章:
http://www.cnblogs.com/fanvy/archive/2013/02/07/2908769.html
http://www.cnblogs.com/cmt/archi ... is_not_defined.html



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-8-7 16:44:28 | 显示全部楼层
不好意思,现在没时间帮你看,等我上班了一定帮你看看,我会记得回来看的,请楼主放心。
发表于 2014-8-17 09:29:41 | 显示全部楼层
楼主,帮帮我吧,,这个问题一直解决不了
发表于 2014-8-17 09:30:27 | 显示全部楼层
楼主帮帮我啊,这个问题一直解决不了。快哭了。。
发表于 2014-9-5 23:37:08 | 显示全部楼层
强烈支持楼主ing……
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-19 11:55

© 2014-2021

快速回复 返回顶部 返回列表