代码之家  ›  专栏  ›  技术社区  ›  Birk

ASP.NET没有为某些用户代理生成JavaScript

  •  5
  • Birk  · 技术社区  · 15 年前

    *********************编辑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>
    

    Codebehind:

    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=" />
    

    将网页保存到桌面并在记事本中打开会显示相同的内容…

    6 回复  |  直到 15 年前
        1
  •  7
  •   Birk    15 年前

    问题是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
  •  2
  •   Gromer    15 年前

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

        3
  •  1
  •   CarmineSantini    15 年前

    基于新的信息,我认为很明显这是一个Firefox问题(也许您有一个附加模块阻塞JS),而不是一个编程问题。我在xp pro上使用vs 2008和ff3可以得到很好的结果,正如我所期望的,大多数其他人都会尝试它。

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

        4
  •  1
  •   David McEwing    15 年前

    你有 AutoEventWireup 设置为false,但不重写OnInit以附加事件。尝试更改 自动事件布线 成真。

    编辑:从更多信息来看,可能是它在machine.config的brower capabilities部分错误地识别了firefox。(或web.config)。

    也可能是因为在firefox中禁用了javascript,因此.net决定没有必要呈现javascript内容,如果存在这样的内容,应该使用不同的方法来进行回发处理。

        5
  •  0
  •   Chris    15 年前

    您确定在Web服务器上安装了ASP.NET吗?

        6
  •  0
  •   Dan Herbert    15 年前

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

    ASP.NET只希望在订阅了需要它正常工作的事件侦听器时生成uuDoPostback()函数。