我有一个简单的asp.net页面(框架3.5)和一个带有一系列下拉列表的UpdatePanel我想要异步填充。一切在所有主流浏览器(Opera,Safari,IE6,IE7,FF3)中都能正常工作,但在Chrome中则不行。
Chrome似乎忽略了必须发出异步请求的SelectedIndexChanged事件。
任何人都知道一个简单的解决方法吗? 谢谢!
编辑:更多信息
正如我对Adam Lassek说的那样,更新面板在点击内部的asp:Button之后刷新,但它不适用于下拉列表的SelectedIndexChanged
事件。
updatepanel设置如下:
<asp:UpdatePanel ID="updPanel" runat="server" UpdateMode="Always" ChildrenAsTriggers="true">
未指定触发器,并且投影设置了AutoPostBack="true"
更新:(并重新标记)
经过几次尝试后,我发现它不是UpdatePanel的问题,但似乎即使在没有ScriptManager和UpdatePanel的页面中,下拉菜单的AutoPostback也无法正常工作...... 我确信这只是一个关于这个项目的问题,因为如果我从头开始创建一个新的WebSite并复制它的结构,那么在Chrome中工作得很好...... 我正试图逐步删除原始项目中的所有其他内容,以确切找到问题所在。
如果有人在此期间有一些想法......
答案 0 :(得分:15)
与 Ajax.NET 和 Chrome &amp; Safari 3 。
小巧,快速的测试可能具有欺骗性,因为它似乎可以与现有的Ajax.NET库一起正常工作。这是因为它设法执行第一个 Ajax请求,并在结束时失败,因此只有当您尝试执行第二个 Ajax操作时才会注意到它已失败。如果您在页面上放置 UpdateProgress 控件,您会注意到在第一次请求后, UpdateProgress 控件不会失败。
幸运的是,有一个答案!
最近有一篇很棒的文章详细介绍了你可以在这里找到的内容:
http://blog.turlov.com/2009/01/aspnet-ajax-compatibility-patch-for.html
它的一般要点是Chrome和Safari 3都会在其userAgent字符串中将自己报告为 WebKit 。
您需要添加一些javascript以帮助Ajax.NET框架识别基于WebKit的浏览器,如下所示:
if (typeof(Sys.Browser.WebKit) == "undefined") {
Sys.Browser.WebKit = {};
}
if (navigator.userAgent.indexOf("WebKit/") > -1 ) {
Sys.Browser.agent = Sys.Browser.WebKit;
Sys.Browser.version =
parseFloat(navigator.userAgent.match(/WebKit\/(\d+(\.\d+)?)/)[1]);
Sys.Browser.name = "WebKit";
}
您需要将其添加到javascript文件并在 ScriptManager 中引用它:
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Path="~/assets/javascript/WebKit.js" />
</Scripts>
</asp:ScriptManager>
请注意,您可以将 WebKit.js 保留在程序集中,并使用类似于此的ScriptReference标记进行引用:
<asp:ScriptReference Assembly="Scripts" Name="Scripts.webkit.js" />
完成所有这些后,如果可能的话,停止使用WebForms和Ajax.NET并使用MVC和jQuery:)
答案 1 :(得分:2)
这是因为MicrosoftAjax.js进行浏览器检测,并且错误地将Chrome检测为Safari。要解决此问题,您需要进行以下更改:
添加新的浏览器类型
Sys.Browser = {};
Sys.Browser.InternetExplorer = {};
Sys.Browser.Firefox = {};
Sys.Browser.Safari = {};
Sys.Browser.Opera = {};
Sys.Browser.Chrome = {};
更新if-then逻辑以搜索Chrome
else if (navigator.userAgent.indexOf(' Firefox/') > -1) {
Sys.Browser.agent = Sys.Browser.Firefox;
Sys.Browser.version = parseFloat(navigator.userAgent.match(/ Firefox\/(\d+\.\d+)/)[1]);
Sys.Browser.name = 'Firefox';
Sys.Browser.hasDebuggerStatement = true;
}
else if (navigator.userAgent.indexOf(' Chrome/') > -1) {
Sys.Browser.agent = Sys.Browser.Chrome;
Sys.Browser.version = parseFloat(navigator.userAgent.match(/ Chrome\/(\d+\.\d+)/)[1]);
Sys.Browser.name = 'Chrome';
Sys.Browser.hasDebuggerStatement = true;
}
else if (navigator.userAgent.indexOf(' AppleWebKit/') > -1) {
Sys.Browser.agent = Sys.Browser.Safari;
Sys.Browser.version = parseFloat(navigator.userAgent.match(/ AppleWebKit\/(\d+(\.\d+)?)/)[1]);
Sys.Browser.name = 'Safari';
请务必在Safari之前检查Chrome。如果您需要帮助将Framework脚本替换为自定义版本read this。
<强>更新强>
我创建了一个测试页面并在其上添加了以下控件:
<asp:ScriptManager ID="scriptManager1" runat="server" />
<asp:UpdatePanel ID="panel1" runat="server" ChildrenAsTriggers="true">
<ContentTemplate>
<asp:DropDownList ID="ddlTest" runat="server" AutoPostBack="true">
<asp:ListItem Value="0" Text="Item 1" />
<asp:ListItem Value="1" Text="Item 2" />
</asp:DropDownList>
<asp:Literal ID="litTest" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
并编写了以下代码隐藏:
protected override void OnInit(EventArgs e)
{
ddlTest.SelectedIndexChanged += new EventHandler(ddlTest_SelectedIndexChanged);
base.OnInit(e);
}
void ddlTest_SelectedIndexChanged(object sender, EventArgs e)
{
litTest.Text = "Selected: " + ddlTest.SelectedItem.Text;
}
Updatepanel在Chrome中运行良好,无需修改Ajax库。所以,我认为还有其他因素导致了这个问题。您需要通过消除过程来找出问题的原因。从像这个例子那样简单的东西开始,一次完成你所拥有的东西。
答案 2 :(得分:0)
使用MVC和jQuery代替WebForms和ASP.NET AJAX不是一个合适的建议。人们应该了解所有技术和方法的优缺点。
首先,MVC是一种设计模式,与所提到的特定框架无关。您可以使用WebFroms轻松实现MVC模式。 MVC for ASP.NET和WebForms有许多不同的实现。
其次,jQuery是一个优秀的JavaScript库,它不允许与服务器端ASP.NET功能进行任何集成,也不允许使用ASP.NET 3.5+标准的ASP.NET AJAX框架。利用ASP.NET功能,如服务器端标记,ScriptManager控制,服务器端脚本组合,本地化和全球化等。
第三,jQuery可以很容易地与ASP.NET和ASP.NET AJAX框架结合使用,从而增强了客户端编程。微软已经宣布jQuery将与下一代ASP.NET 4.0一起发布,现在你可以手动将它添加到你的项目中。
答案 3 :(得分:0)
我今天遇到了类似的问题(尽管我没有使用Ajax),并找到了修复方法。请参阅this blog post下的第三条评论。
答案 4 :(得分:0)
我有同样的问题。我在ajax回发中有一个下拉列表,当所选索引发生变化时需要进行更新。它也适用于新项目中的基本页面。
添加其他答案中提到的Webkit脚本后,我仍然遇到同样的问题,在Chrome中运行javascript调试器时出现此错误:
未捕获的异常ReferenceError:未定义evt
更新:解决方案
我发现在我的情况下,它是一个干扰事件处理程序的CustomValidator。将EnableClientScript设置为false可修复此问题。
答案 5 :(得分:0)