原文: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

5596

被折叠的 条评论
为什么被折叠?



