事件大致如下
这个问题我相信有不少人见过,就是使用系统的分页功能时,或者是使用系统控件,都会有一个回发的功能,这个功能是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>
但是我发现在一些电脑上,也不知道是什么情况就是没有这两个方法,然后就单击按钮或者是分页时就提示如下
这很明显就是 __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
|