12

我有一个简单的 asp.net 页面(框架 3.5)和一个带有一系列下拉列表的 UpdatePanel,我想异步填充。在所有主流浏览器(Opera、Safari、IE6、IE7、FF3)中一切正常,但在 Chrome 中却不行。

Chrome 似乎忽略了必须发出异步请求的 SelectedIndexChanged 事件。

任何人都知道一个简单的解决方法吗?谢谢!

编辑:更多信息

正如我对 Adam Lassek 所说,更新面板在单击其中的 asp:Button 后刷新,但它不适用于下拉菜单的SelectedIndexChanged事件。

更新面板设置如下:

<asp:UpdatePanel ID="updPanel" runat="server" UpdateMode="Always" ChildrenAsTriggers="true">

没有指定触发器,并且下拉菜单有集合AutoPostBack="true"

更新:(和重新标记)

经过几次尝试,我发现这不是 UpdatePanel 的问题,但似乎下拉菜单的 AutoPostback 无法正常工作,即使在没有 ScriptManager 和 UpdatePanel 的页面中也是如此......我确定这是一个问题只涉及这个项目,因为如果我从头开始一个新的网站并复制它的结构,在 Chrome 中工作正常......我正在尝试逐步删除原始项目中的所有其他内容,以找到确切的内容问题。

如果有人在此期间有一些想法......

4

6 回答 6

15

已知与Ajax.NETChrome & 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 :)

于 2009-02-10T11:48:47.233 回答
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';

请务必将 Chrome 检查放在 Safari 之前。如果您需要帮助将框架脚本替换为您的自定义版本,请阅读此

更新:

我创建了一个测试页面并在其上放置了以下控件:

<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 库。所以,我认为是其他原因导致了这个问题。您将需要通过消除过程来隔离问题的原因。从像这个例子这样简单的事情开始,一次完成你所拥有的作品。

于 2009-02-04T00:04:46.747 回答
0

使用 MVC 和 jQuery 代替 WebForms 和 ASP.NET AJAX 不是一个合适的建议。人们应该了解可供选择的技术和方法的所有优缺点。

首先,MVC 是一种设计模式,与提到的特定框架无关。您可以使用 WebFroms 轻松实现 MVC 模式。ASP.NET 和 WebForms 有许多不同的 MVC 实现。

其次,jQuery 是一个很棒的 JavaScript 库,它不允许与服务器端 ASP.NET 功能进行任何集成,也不会利用它,这与 ASP.NET 3.5+ 标配并充分利用 ASP 的 ASP.NET AJAX 框架相反。 NET 特性,如服务器端标记、ScriptManager 控件、服务器端脚本组合、本地化和全球化等。

第三,jQuery 可以很容易地与 ASP.NET 和 ASP.NET AJAX 框架结合使用,从而增强客户端编程。Microsoft 宣布 jQuery 将与下一个 ASP.NET 4.0 一起提供,现在您只需手动将其添加到您的项目中即可。

于 2009-03-12T18:04:04.717 回答
0

我今天刚刚遇到了一个类似的问题(虽然我没有使用 Ajax),并找到了解决方法。请参阅此博客文章的第三条评论。

于 2009-04-30T22:22:57.100 回答
0

我也有同样的问题。我在 ajax 回发中有一个下拉菜单,需要在所选索引更改时进行更新。它也适用于新项目中的基本页面。

添加其他答案中提到的 Webkit 脚本后,我仍然遇到相同的问题,并且在 Chrome 中运行 javascript 调试器时出现此错误:

未捕获的异常 ReferenceError: 未定义 evt

更新:解决方案

我发现在我的情况下,它是一个 CustomValidator 干扰了事件处理程序。将 EnableClientScript 设置为 false 可解决此问题。

于 2009-05-01T02:06:09.013 回答
0

您可以查看解决方案

http://dotnetguts.blogspot.com/2009/05/dropdownlist-autopostback-problem-with.html

于 2009-05-19T03:55:18.087 回答