Asp.Net、DropDownList、AutoPostBack和Google Chrome

Asp.Net、DropDownList、AutoPostBack和Google Chrome,asp.net,drop-down-menu,google-chrome,autopostback,Asp.net,Drop Down Menu,Google Chrome,Autopostback,我有一个简单的asp.net页面(framework 3.5)和一个UpdatePanel,其中包含一系列我想要异步填充的dropdownlist。在所有主流浏览器(Opera、Safari、IE6、IE7、FF3)中都可以正常工作,但在Chrome中则不行 Chrome似乎忽略了必须发出异步请求的SelectedIndexChanged事件 有人知道解决这个问题的简单方法吗? 谢谢 编辑:更多信息 正如我对Adam Lassek所说,updatepanel在单击其中的asp:按钮后会刷新,但它

我有一个简单的asp.net页面(framework 3.5)和一个UpdatePanel,其中包含一系列我想要异步填充的dropdownlist。在所有主流浏览器(Opera、Safari、IE6、IE7、FF3)中都可以正常工作,但在Chrome中则不行

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

有人知道解决这个问题的简单方法吗? 谢谢

编辑:更多信息

正如我对Adam Lassek所说,updatepanel在单击其中的asp:按钮后会刷新,但它不适用于下拉菜单的
SelectedIndexChanged
事件

updatepanel的设置如下所示:

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

没有指定触发器,并且DropDow具有集合
AutoPostBack=“true”

更新:(并重新标记)

经过几次尝试,我发现这不是UpdatePanel的问题,但下拉列表的自动回写似乎无法正常工作,即使在没有ScriptManager和UpdatePanel的页面中也是如此。。。 我确信这只是一个关于这个项目的问题,因为如果我从头开始创建一个新的网站,并复制这个网站的结构,在Chrome上运行良好。。。 我正试图一步一步地删除原始项目中的所有其他内容,以找到问题所在


如果有人同时有了一些想法……

这是因为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检查。如果需要使用自定义版本替换框架脚本的帮助

更新:

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

<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>

Updatepanel在Chrome中运行良好,无需修改Ajax库。所以,我认为是其他原因导致了这个问题。您需要通过消除过程来隔离问题的原因。从像这个例子这样简单的事情开始,一次完成一件事情。

已知与Ajax.NETChrome&Safari 3不兼容

小而快速的测试可能是骗人的,因为它看起来可以与现有的Ajax.NET库一起正常工作。这是因为它成功地执行了第一个Ajax请求,并在请求结束时失败,因此只有当您尝试执行第二个Ajax操作时,您才会注意到它失败了。如果在页面上放置一个UpdateProgress控件,您会注意到在第一次请求后,您的UpdateProgress控件不会消失

幸运的是,有一个答案

最近有一个很棒的帖子,详细介绍了你可以在这里找到的方法:

其要点是,Chrome和Safari 3在其用户代理字符串中都报告自己为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文件中,并在脚本管理器中引用它:

<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:)

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

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

其次,jQuery是一个优秀的JavaScript库,不允许与服务器端ASP.NET功能进行任何集成,也不利用服务器端ASP.NET功能,而ASP.NET AJAX框架是ASP.NET 3.5+的标准配置,它充分利用了ASP.NET功能,如服务器端标记、ScriptManager控件、服务器端脚本组合、,本土化、全球化等


第三,jQuery可以轻松地与ASP.NET和ASP.NET AJAX框架结合使用,从而增强客户端编程。微软已经宣布jQuery将与下一个ASP.NET 4.0一起发布,现在您可以手动将其添加到您的项目中。

我今天遇到了类似的问题(尽管我没有使用Ajax),并找到了一个修复方法。请参阅下面的第三条评论。

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

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

未捕获异常引用错误:未定义evt

更新:解决方案

我发现在我的例子中,是CustomValidator干扰了事件处理程序。将EnableClientScript设置为false修复了该问题。

您可以签出解决方案

我尝试了你的建议(感谢你的回答),但似乎没有改变任何事情。我发现,如果我在updatepanel(已将ChildrenAsTrigger设置为true)中插入asp:按钮,效果很好。但它不适用于下拉列表中的SelectedIndexChanged(当然只有Chrome)…谢谢!这解决了我在Chrome的UpdatePanel中分页GridView的问题。“如果可能的话,停止使用WebForms和Ajax.NET,使用MVC和jQuery。”Sage的建议,但在
<asp:ScriptReference Assembly="Scripts" Name="Scripts.webkit.js" />