【问题标题】:ASP.net not generating javascript for some User AgentsASP.net 没有为某些用户代理生成 javascript
【发布时间】:2010-10-29 09:30:17
【问题描述】:

************************编辑 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 中的 部分修复的问题。默认情况下,未知浏览器被视为无法使用 javascript 的旧浏览器。

标签: asp.net javascript user-agent auto-generate


【解决方案1】:

问题是 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>

【讨论】:

【解决方案2】:

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

【讨论】:

  • 我发现了问题(并编辑了问题)这是我一直用于测试的用户代理欺骗插件。虽然我一点也不高兴这是问题所在。
  • 至少你找到了答案!
【解决方案3】:

根据新信息,我认为很明显这是一个 Firefox 问题(也许你有一个插件阻塞 JS),而不是一个编程问题。我在 XP Pro 上使用 VS 2008 和 FF3 的代码得到了很好的结果,正如我所期望的那样,大多数其他人都会尝试它。

您可以尝试重新安装Firefox,确保JS在所有其他站点上都可以正常工作,确保localhost没有不同的安全权限...

【讨论】:

    【解决方案4】:

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

    编辑:从更多信息来看,它可能是在您的 machine.config 的浏览器功能部分中错误地识别 Firefox。 (或 web.config)。

    也可能是 Firefox 中的 JavaScript 已关闭,因此 .NET 确定渲染 Javascript 内容没有意义,如果有这样的事情,应该使用不同的回发处理方法。

    【讨论】:

      【解决方案5】:

      您确定您的网络服务器上安装了 ASP.NET?

      【讨论】:

      • 是的,我使用的是 Visual Studio 2008 9.0.30729 Framework 3.5 SP1
      【解决方案6】:

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

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

      【讨论】:

      • Protected Sub linkTest_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles linkTest.Click 这是我的事件处理程序......就像我说的,当它在我的家用计算机上时,我的Web 服务器工作正常。
      • 哎呀,我忽略了您正在使用 LinkBut​​ton 的事实。我在想那是一个 Button 控件,如果我没记错的话,它不需要 __doPostBack() 方法。另外,因为 AutoEventWireup 是假的,所以看起来该方法本身不会与控件绑定,但其他人已经提到...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      相关资源
      最近更新 更多