代码之家  ›  专栏  ›  技术社区  ›  tanathos

ASP.NET、DropDownList、AutoPostBack和Google Chrome

  •  12
  • tanathos  · 技术社区  · 16 年前

    我有一个简单的ASP.NET页面(框架3.5)和一个更新面板,其中包含一系列要异步填充的DropDownList。所有主要浏览器(Opera、Safari、IE6、IE7、FF3)都可以正常工作,但不能在Chrome中工作。

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

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

    编辑:更多信息

    正如我对亚当·拉塞克所说的,在单击它内部的一个asp:按钮后,更新面板将刷新,但它不适用于下拉列表 SelectedIndexChanged 事件。

    更新面板设置如下:

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

    未指定触发器,DropDow具有集合 AutoPostBack="true"

    更新: (和拖延)

    经过几次尝试,我发现这不是UpdatePanel的问题,但看起来下拉列表的自动回写功能不正常,即使是在没有Scriptmanager和UpdatePanel的页面中… 我敢肯定,这只是一个关于这个项目的问题,因为如果我从头开始一个新的网站,并复制这个结构,在Chrome中工作得很好… 我正试图一步一步地删除原始项目中的所有其他内容,以准确找出问题所在。

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

    6 回复  |  直到 15 年前
        1
  •  15
  •   joshcomley    15 年前

    与存在已知的不相容性 AJAX.NET 和; 狩猎3 .

    小而快速的测试可能是有欺骗性的,因为它在现有的ajax.net库中工作得很好。这是因为它能够执行 第一 Ajax请求并在结束时失败,因此仅当您尝试执行 第二 Ajax操作您会注意到它失败了吗?如果你把一个 更新进度 在您的页面上,您会注意到在第一次请求之后 更新进度 控制不会消失。

    幸运的是,有一个答案!

    最近有一篇很好的文章,详细介绍了该做什么,你可以在这里找到:

    http://blog.turlov.com/2009/01/aspnet-ajax-compatibility-patch-for.html

    一般的要点是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>
    

    请注意,您可以保留 网络浏览器 在程序集和引用中,通过使用类似于此的scriptReference标记:

    <asp:ScriptReference Assembly="Scripts" Name="Scripts.webkit.js" />
    

    完成所有这些之后,如果可能的话,停止使用webforms和ajax.net并使用mvc和jquery:)

        2
  •  2
  •   Adam Lassek    16 年前

    发生这种情况是因为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';
    

    在旅行之前一定要检查一下铬合金。如果需要用自定义版本替换框架脚本的帮助, 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库。所以,我认为是其他原因导致了这个问题。您需要通过排除过程来隔离问题的原因。从这个简单的例子开始,一次完成一件作品。

        3
  •  0
  •   aturlov    15 年前

    使用MVC和JQuery代替WebForms和ASP.NET AJAX是不合适的建议。我们应该理解技术和方法的所有优缺点。

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

    第二,jquery是一个伟大的javascript库,它不允许与服务器端的ASP.NET功能进行任何集成,也不利用服务器端的ASP.NET功能,而ASP.NET AJAX框架是ASP.NET 3.5+的标准配置,并且完全利用了ASP.NET功能,如服务器端标记、脚本管理器控件、服务器端脚本组合、本地化全球化等。

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

        4
  •  0
  •   Jonathan Schuster    15 年前

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

        5
  •  0
  •   Jonathan Parker    15 年前

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

    在添加了其他答案中提到的webkit脚本之后,我仍然会遇到同样的问题,在chrome中运行javascript调试器时,我会得到以下错误:

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

    更新:解决方案

    我发现在我的例子中,是一个自定义验证器干扰了事件处理程序。将EnableClientScript设置为false可修复此问题。