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

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

*********************编辑 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=" />

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

最佳答案

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

关于ASP.net 不为某些用户代理生成 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/917688/

相关文章:

c# - 我可以重用内置 IIS 身份验证但提供我自己的凭据检查吗?

asp.net - 从 WebForms 调用 ASP.NET MVC3 区域

asp.net - 获取在 AJAX UpdatePanel 中触发回发的 ASP.NET 控件

asp.net - 在 VB.NET 中获取 CheckBoxList 的所有选中值

ruby-on-rails - 检测通过应用程序(即 Twitter)浏览 Rails 站点的 iOS 设备

php - 使用 PHP 进行操作系统检测的最简单方法?

javascript - Ember.js 路由器应用程序架构 - 如何在松散耦合的组件之间正确通信

javascript - 为什么不能通过 JavaScript 在 'style' 属性中插入分号?

javascript - React setState() 不适用于单选字段 handleInput 方法

wicket - 在 Wicket 中检查用户代理