ASP.net不为某些用户代理生成JavaScript

5

********************编辑2********************** 我找到了问题......但我不喜欢这个结果。 我之前在测试面向iPhone的移动应用程序,并使用插件将Firefox的用户代理字符串掩盖为iPhone。

事实上,.Net并没有仅仅基于那一点信息生成所需的回传代码。

然而,我不喜欢这样做,因为由于iPhone和其他多媒体设备可以解释JavaScript,ASP.net正在破坏任何依赖服务器生成的JavaScript运行的应用程序。

因此,如果社区允许......我想更改我的官方问题......为什么ASP.net不会为特定的浏览器生成JavaScript,以及如何关闭此“功能”。

*************** 结束编辑2 ***************

我遇到了一个奇怪的问题。我从远程主机复制了一些工作代码到我的工作电脑上。当我尝试使用该页面时,出现了JavaScript错误。

__doPostBack is not defined
javascript:__doPostBack('ctl00$ContentPlaceHolder1$login','')()()

当我查看输出页面源代码时,确实没有服务器端生成的JavaScript。
我尝试创建一个简单的页面:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="jsTest.aspx.vb" Inherits="_jsTest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:TextBox ID="tbTest" runat="server"></asp:TextBox><br />
        <asp:LinkButton ID="linkTest" runat="server">LinkButton</asp:LinkButton>
    </form>
</body>
</html>

后台代码:

Partial Class _jsTest
    Inherits System.Web.UI.Page
    Protected Sub linkTest_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles linkTest.Click
        Response.Write(tbTest.Text)
    End Sub
End Class

出现了相同的错误。

我尝试过重新启动(嘿,这有一半的时间是有效的),清除了App_Code、global.asax和web.config中的所有内容,添加了一个带有autopostback=true的文本框...我已经没有想法了。

有人能够解释一下这里发生了什么吗?

**************更多信息************** 我刚刚在IE中尝试了所有操作,结果正常,页面源代码显示:

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTkxNTA2MDE2NWRkxhZMwlMVwJprcVsvQLJLrTcgaSM=" />

<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>
<div>
    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwK20LZAAuzRsusGAsz0+6YPxxO+Ewv1XsD5QKJiiprrGp+9a3Q=" />
</div>

在Firefox中,源代码只显示:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTkxNTA2MDE2NWRkxhZMwlMVwJprcVsvQLJLrTcgaSM=" />

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwK20LZAAuzRsusGAsz0+6YPxxO+Ewv1XsD5QKJiiprrGp+9a3Q=" />

将网页保存到桌面并在记事本中打开,会发现相同的内容...

我正在进行一些研究... 看起来可以通过在web.config或machine.config中添加<browserCaps>部分来解决这个问题。默认情况下,未知的浏览器被视为不支持JavaScript的旧浏览器。 - Birk
6个回答

7
问题在于ASP.net默认处理未知浏览器的方式...比如iPhone。即使假设未知浏览器可以使用JavaScript,你也可以在web.config或machine.config的部分指定浏览器的能力。
请查看http://slingfive.com/pages/code/browserCaps/获取ASP.net的更新的browsercaps配置文件。
以下是匹配基于GECKO的浏览器(Netscape 6+,Mozilla/Firefox等)的示例:
<case match="^Mozilla/5\.0 \([^)]*\) (Gecko/[-\d]+)(?'VendorProductToken' (?'type'[^/\d]*)([\d]*)/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*)))?">
                browser=Gecko
                <filter>
                    <case match="(Gecko/[-\d]+)(?'VendorProductToken' (?'type'[^/\d]*)([\d]*)/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*)))">
                        type=${type}
                    </case>
                    <case> <!-- plain Mozilla if no VendorProductToken found -->
                        type=Mozilla
                    </case>
                </filter>
                frames=true
                tables=true
                cookies=true
                javascript=true
                javaapplets=true
                ecmascriptversion=1.5
                w3cdomversion=1.0
                css1=true
                css2=true
                xml=true
                tagwriter=System.Web.UI.HtmlTextWriter
                <case match="rv:(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*))">
                    version=${version}
                    majorversion=0${major}
                    minorversion=0${minor}
                    <case match="^b" with="${letters}">
                        beta=true
                    </case>
                </case>
            </case>

你比我更快 - BrowserCaps确实是这里的问题 - 你可能想要查看http://owenbrady.net/browsercaps/,它最近更新了1.1和2.0版本 - 感谢https://dev59.com/P0bRa4cB1Zd3GeqPyDNg#431991。 - Zhaph - Ben Duguid

2
在重新安装Firefox之前,运行它的调试模式(我认为它被称为调试模式)。它会关闭所有插件,这可以帮助您缩小范围。其他浏览器如Chrome或Safari呢?

我找出了问题(并编辑了问题)。原来是我一直用于测试的用户代理欺骗插件。虽然我对这个问题感到非常不满意。 - Birk
至少你找到了答案! - Gromer

1

您将AutoEventWireup设置为false,但没有覆盖OnInit以附加事件。尝试将AutoEventWireup更改为true。

编辑:根据更多信息,可能是在machine.config(或web.config)的浏览器功能部分错误地识别了Firefox。

也可能是Firefox中关闭了JavaScript,因此.NET确定没有渲染JavaScript内容的必要,如果有这样的东西,应该使用不同的方法来处理回发。


1
根据新的信息,我认为很明显这是一个Firefox的问题(也许你有一个阻止JS的插件),而不是一个编程问题。我使用VS 2008和XP Pro上的FF3使用您的代码得到了良好的结果,我相信任何其他人尝试它也会得到同样的结果。
您可以尝试重新安装Firefox,确保JS在所有其他网站上都能正常工作,确保localhost没有不同的安全权限...

0
你确定已经在你的 Web 服务器上安装了 ASP.NET 吗?

是的,我正在使用Visual Studio 2008 9.0.30729框架3.5 SP1。 - Birk

0

看起来 __doPostBack() 函数没有被生成,因为您没有需要它的服务器端事件。

ASP.NET 喜欢只在您订阅了需要它才能正确运行的事件监听器时才生成 __doPostBack() 函数。


Protected Sub linkTest_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles linkTest.Click这是我的事件处理程序...就像我说的,在我的家用电脑和Web服务器上,它都能正常工作。 - Birk
哎呀,我忽略了你在使用LinkButton这一事实。我一直认为那是一个Button控件,如果我没记错的话,它不需要__doPostBack()方法。而且,由于AutoEventWireup为false,看起来这个方法本身并没有与控件绑定,但是已经有人提到过这个问题了... - Dan Herbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接