【问题标题】:Asp.Net, DropDownList, AutoPostBack and Google ChromeAsp.Net、DropDownList、AutoPostBack 和 Google Chrome
【发布时间】:2009-02-03 21:34:34
【问题描述】:

我有一个简单的 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">

没有指定触发器,dropdows 有集合AutoPostBack="true"

更新:(和重新标记)

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

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

【问题讨论】:

    标签: asp.net drop-down-menu google-chrome autopostback


    【解决方案1】:

    已知与 Ajax.NETChromeSafari 3 不兼容。

    小而快的测试可能具有欺骗性,因为它看起来可以与现有的 Ajax.NET 库一起正常工作。这是因为它设法执行了 first Ajax 请求并在结束时失败,所以只有当您尝试执行 second 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 :)

    【讨论】:

    • 谢谢!这解决了我在 Chrome 中的 UpdatePanel 内分页 GridView 的问题。
    • "如果可能,请停止使用 WebForms 和 Ajax.NET,并使用 MVC 和 jQuery。"明智的建议,但与此同时,此修复程序效果很好。谢谢好心的先生。
    • 我试过了,将脚本编译到我的程序集中,并通过在第二个 if 块中添加一个超级烦人的警报('')来验证它正在执行。但是在页面加载后,我检查了浏览器代理和名称,并将其设置为 Chrome。似乎脚本必须运行得太早并且将其更改覆盖回 Chrome?我将它与加载到 SharePoint 2007 网站的 UserControl 一起使用。对此有什么想法吗?
    【解决方案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。如果您需要帮助将框架脚本替换为您的自定义版本,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;
    }
    

    更新面板在 Chrome 中运行良好,无需修改 Ajax 库。所以,我认为是其他原因导致了这个问题。您将需要通过消除过程来隔离问题的原因。从像这个例子这样简单的事情开始,然后逐步完成你所拥有的部分。

    【讨论】:

    • 我已经尝试过您的建议(并感谢您的回答),但它似乎并没有改变任何东西..我看到如果我在更新面板中插入一个 asp:Button(设置了 ChildrenAsTrigger为真),它工作正常..但它不适用于 DropDowns 的 SelectedIndexChanged(当然只有 Chrome)..
    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      我今天遇到了一个类似的问题(虽然我没有使用 Ajax),并找到了解决方法。请参阅this blog post 上的第三条评论。

      【讨论】:

        【解决方案5】:

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

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

        未捕获的异常 ReferenceError: evt is not defined

        更新:解决方案

        我发现在我的例子中是一个 CustomValidator 干扰了事件处理程序。将 EnableClientScript 设置为 false 可解决此问题。

        【讨论】:

          【解决方案6】:
          猜你喜欢
          • 2011-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-20
          • 1970-01-01
          相关资源
          最近更新 更多