[英]ASP.net not generating javascript for some User Agents
********************编辑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>
在重新安装Firefox之前,请在调试模式下运行它(我认为它称为调试模式)。 它会关闭所有插件,这可以帮助您缩小范围。 那些其他浏览器如Chrome或Safari呢?
您将AutoEventWireup
设置为false,但没有OverIn of OnInit来附加事件。 尝试将AutoEventWireup
更改为true。
编辑:从更多信息可能是它在machine.config的浏览器功能部分错误地识别Firefox。 (或web.config)。
它也可能是在Firefox中关闭JavaScript,因此.NET确定没有点呈现Javascript的东西,并且应该使用不同的方法来回发处理,如果有这样的事情。
根据新信息,我认为很明显这是一个Firefox问题(也许你有一个附加阻止JS),而不是一个编程问题。 我在XP Pro上使用VS 2008和FF3的代码得到了很好的结果,因为我期望大多数人都会尝试它。
您可以尝试重新安装Firefox,确保JS可以在所有其他站点上运行,确保localhost没有不同的安全权限......
您确定在Web服务器上安装了ASP.NET吗?
看起来没有生成__doPostBack()
函数,因为您没有需要它的服务器端事件。
ASP.NET希望只有在订阅了需要它才能正常运行的事件侦听器时才生成__doPostBack()函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.