原文:http://www.sufeinet.com/thread-4564-1-1.html
这个问题我相信有不少人见过,就是使用系统的分页功能时,或者是使用系统控件,都会有一个回发的功能,这个功能是asp.net自动管理的,就是为了和我们后台的Cs代码连接起来,
但是有时候这个方法并不会生成,正常情况下在页面的Form下面都会生成如下代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | <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> |
但是我发现在一些电脑上,也不知道是什么情况就是没有这两个方法,然后就单击按钮或者是分页时就提示如下
<ignore_js_op>
这很明显就是 __doPostBack方法不存在,
ReferenceError:__doPostBack is not defined
ReferenceError:__doPostBack is not defined
我就奇怪了,为什么呢?
而且在这个电脑上的所有浏览器都有一样,IE678 火狐,Google,等都是同样的效果。
着实让人郁闷,所以来博客园请教一下大家看看这种问题应该怎么解决了,
我到是想到一个比较次的方法,只能是在没有找到解决方案之后应的急
代码如下
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <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专门用来修复这个问题,各位如遇到同样的问题,可参考以下说明:
- KB2600088: Hotfix 适用在 Microsoft.NET Framework 4.0 中的 ASP.NET [英文]
- KB2608565: Hotfix 适用在 .NET Framework 3.5.1 中的 ASP.NET [英文]
- KB2600100: Hotfix 适用在 .NET Framework 3.5 SP1 与 .NET Framework 2.0 SP2 中的 ASP.NET [英文]
2.简单的解决方法是,在网站根目录,新增一个浏览器定义文件(browser definition file)
步骤如下:
1.添加一个"App_Browsers"文件夹
2.添加一个"*.browser"后缀的文件,如IE10.browser.
3.添加文件内容如下:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | <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 Web Forms吗?如果在用的话,你可要小心了:
千万不要使用LinkButton控件!
为什么呢?
请看ASP.NET代码:
01 | <asp:LinkButton Text= "Post" runat= "server" id= "lbPost" /> |
请看运行时的页面HTML代码:
01 | <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
百度查阅资料得知,这是微软NET环境下的一个BUG,官方已经发布了新的补丁包,可直接通过下载最新Framwork补丁得到修改。
除此办法以外,还可以在项目中直接修改,方法如下:
1、项目根目录下,建App_Browsers文件夹
2、在文件夹中新建文件ie.browser文件,文件内容粘贴如下内容:
<browsers><browser id="IE11" parentID="Mozilla"><identification><userAgent match="Trident\/7.0; rv:(?'version'(?'major'\d+)(\.(?'minor'\d+)?)(?'letters'\w*))(?'extra'[^)]*)" /><userAgent nonMatch="IEMobile" /></identification><capture><userAgent match="Trident/(?'layoutVersion'\d+)" /></capture><capabilities><capability name="browser" value="IE" /><capability name="layoutEngine" value="Trident" /><capability name="layoutEngineVersion" value="${layoutVersion}" /><capability name="extra" value="${extra}" /><capability name="isColor" value="true" /><capability name="letters" value="${letters}" /><capability name="majorversion" value="${major}" /><capability name="minorversion" value="${minor}" /><capability name="screenBitDepth" value="8" /><capability name="type" value="IE${major}" /><capability name="version" value="${version}" /></capabilities></browser><!-- Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11,0) like Gecko --><browser id="IE110" parentID="IE11"><identification><capability name="majorversion" match="11" /></identification><capabilities><capability name="ecmascriptversion" value="3.0" /><capability name="jscriptversion" value="5.6" /><capability name="javascript" value="true" /><capability name="javascriptversion" value="1.5" /><capability name="msdomversion" value="${majorversion}.${minorversion}" /><capability name="w3cdomversion" value="1.0" /><capability name="ExchangeOmaSupported" value="true" /><capability name="activexcontrols" value="true" /><capability name="backgroundsounds" value="true" /><capability name="cookies" value="true" /><capability name="frames" value="true" /><capability name="javaapplets" value="true" /><capability name="supportsCallback" value="true" /><capability name="supportsFileUpload" value="true" /><capability name="supportsMultilineTextBoxDisplay" value="true" /><capability name="supportsMaintainScrollPositionOnPostback" value="true" /><capability name="supportsVCard" value="true" /><capability name="supportsXmlHttp" value="true" /><capability name="tables" value="true" /><capability name="supportsAccessKeyAttribute" value="true" /><capability name="tagwriter" value="System.Web.UI.HtmlTextWriter" /><capability name="vbscript" value="true" /></capabilities></browser> </browsers>
3、重启IIS尝试是否修正错误,如未修正,把上述代码粘贴到%WinDir%\Microsoft.NET\Framework64\v4.0.30319\CONFIG\Browsers文件夹
再次尝试。
4、如果还不行,请安装NET插件:http://www.microsoft.com/zh-cn/download/details.aspx?id=28936