Asp.Net, DropDownList, AutoPostBack und Google Chrome

Ich versuche, Schritt für Schritt alle anderen Dinge im ursprünglichen Projekt zu entfernen, um genau zu finden, was das Problem ist.

Wenn jemand in der Zwischenzeit ein paar Ideen hat....

Ich habe eine einfache asp.net Seite (Framework 3.5) und ein UpdatePanel mit einer Reihe von Dropdownlist ich möchte asynchron auffüllen. Alles funktioniert in allen gängigen Browsern (Opera, Safari, IE6, IE7, FF3), aber nicht in Chrome.

Chrome scheint das SelectedIndexChanged-Ereignis zu ignorieren, das die asynchrone Anforderung stellen musste.

Jeder kennt eine einfache Umgehungsmöglichkeit? Danke!

EDIT: Mehr Informationen

Wie ich Adam Lassek sage, wird das Updatepanel nach dem Klick auf einen asp:Button darin aktualisiert, aber es funktioniert nicht mit dem Dropdown-Event SelectedIndexChanged event..

Das Updatepanel ist wie eingestellt:

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

ohne Trigger angegeben, und die Dropdows haben Sätze AutoPostBack="true"

UPDATE: (und Retagging)

Nach einigen Versuchen stelle ich fest, dass es kein Problem des UpdatePanels ist, aber es scheint, dass das AutoPostback von Dropdowns nicht richtig funktioniert, auch nicht auf Seiten ohne ScriptManager und UpdatePanel... Ich bin sicher, dass es ein Problem nur in Bezug auf dieses Projekt ist, denn wenn ich eine neue WebSite von Grund auf neu starte und die Struktur repliziere, funktioniert dies in Chrome...

Antwort auf "Asp.Net, DropDownList, AutoPostBack und Google Chrome " 6 von antworten

Dies geschieht, weil MicrosoftAjax.js Browser-Erkennung tut, und es erkennt Chrome fälschlicherweise als Safari. Um dies zu beheben, müssen Sie die folgenden Änderungen vornehmen:

Fügen Sie einen neuen Browsertyp

Sys.Browser = {};
Sys.Browser.InternetExplorer = {};
Sys.Browser.Firefox = {};
Sys.Browser.Safari = {};
Sys.Browser.Opera = {};
Sys.Browser.Chrome = {};

Aktualisieren Sie die if-then-Logik, um nach 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';

zu suchen. Achten Sie darauf, die Chrome-Prüfung vor Safari zu setzen. Wenn Sie Hilfe beim Ersetzen des Framework-Skripts durch Ihre benutzerdefinierte Version benötigen, read this. .

UPDATE:

Ich habe eine Testseite erstellt und die folgenden Steuerelemente darauf gesetzt:

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

Und schrieb den folgenden Codebehind:

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

Das Updatepanel funktioniert in Chrome gut, ohne Änderung der Ajax-Bibliothek. Ich denke also, dass etwas anderes dieses Problem verursacht. Sie müssen die Ursache des Problems durch einen Prozess der Eliminierung isolieren. Beginnen Sie mit etwas Einfachem wie diesem Beispiel, und arbeiten Sie bis zu dem, was Sie ein Stück zu einem Zeitpunkt haben.

Es gibt eine bekannte Inkompatibilität mit Ajax.NET und Chrome & Safari 3 .

Kleine, schnelle Tests können trügerisch sein, da es mit dem vorhandenen Ajax.NET Bibliothek gut zu funktionieren scheint, wie es ist. Dies liegt daran, es gelingt, die erste Ajax-Anforderung auszuführen und scheitert, wenn das endet, also nur wenn Sie versuchen, die zweite Ajax-Aktion auszuführen, werden Sie feststellen, dass sie fehlgeschlagen ist. Wenn Sie ein UpdateProgress Steuerelement auf Ihrer Seite setzen, werden Sie feststellen, dass Ihr UpdateProgress Steuerelement nach der ersten Anforderung nicht abnimmt.

Zum Glück gibt es eine Antwort!

Kürzlich gab es einen großartigen Beitrag, in dem detailliert beschrieben wurde, was sie hier zu tun haben:

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

Der allgemeine Gist davon ist, dass sich sowohl Chrome als auch Safari 3 als WebKit in ihren userAgent-Strings melden.

Sie müssen ein wenig Javascript hinzufügen, um das Ajax.NET Framework bei der Erkennung von WebKit-basierten Browsern zu unterstützen, die wie folgt aussehen:

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";
}

Sie müssen das zu einer Javascript-Datei hinzufügen und in Ihrem "-9 darauf verweisen. 9-" ScriptManager :

<asp:ScriptManager ID="ScriptManager1" runat="server">
    <Scripts>
        <asp:ScriptReference Path="~/assets/javascript/WebKit.js" />
    </Scripts>
</asp:ScriptManager>

Beachten Sie, dass Sie das WebKit.js in einer Assembly beibehalten können und darauf verweisen können, indem Sie ein ScriptReference-Tag ähnlich diesem verwenden. :

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

Sobald Sie all dies getan haben, wenn überhaupt möglich, die Verwendung von WebForms und Ajax.NET und mVC und jQuery :)

Es ist kein geeigneter Vorschlag, MVC und jQuery anstelle von WebForms und ASP.NET AJAX zu verwenden. Man sollte alle Vor- und Nachteile der Technologien und Ansätze verstehen, aus denen man wählen kann.

Erstens ist MVC ein Designmuster und hat nichts mit den genannten Frameworks zu tun. Sie können ein MVC-Muster ganz einfach mit WebFroms implementieren. Es gibt viele verschiedene Implementierungen von MVC für ASP.NET und WebForms.

Zweitens, jQuery, da eine große JavaScript-Bibliothek, erlaubt keine Integration mit und nutzt nicht Server-Seite ASP.NET Funktionalität, im Gegensatz zu ASP.NET AJAX-Framework, das Standard mit dem ASP.NET 3.5+ kommt und voll nutzt ASP.NET Funktionen, wie Server-Seitenmarkup, ScriptManager-Steuerung, serverseitige Skript-Kombination, Lokalisierung und Globalisierung, etc.

Drittens kann jQuery problemlos in Verbindung mit ASP.NET und ASP.NET AJAX-Frameworks verwendet werden, wodurch die clientseitige Programmierung verbessert wird. Microsoft hat angekündigt, dass jQuery mit dem nächsten ASP.NET 4.0 ausgeliefert wird und Sie es ihrem Projekt vorerst einfach manuell hinzufügen können.

Ich bin heute auf ein ähnliches Problem gestoßen (obwohl ich Ajax nicht benutzte) und habe eine Lösung gefunden. Siehe den dritten Kommentar unten auf this blog post. .

Ich habe das gleiche Problem. Ich habe eine Dropdown-Liste in einem Ajax-Postback und muss eine Aktualisierung durchführen, wenn sich der ausgewählte Index ändert. Es funktioniert auch mit einer Basisseite in einem neuen Projekt.

Nach dem Hinzufügen des Webkit-Skripts, das in den anderen Antworten erwähnt wird, erhalte ich immer noch das gleiche Problem und beim Ausführen des Javascript-Debuggers in Chrome erhalte ich diesen Fehler:

nicht abgefangene Ausnahme ReferenceError: evt ist nicht definiert

UPDATE: LÖSUNG

Ich fand heraus, dass es in meinem Fall ein CustomValidator war, der den Ereignishandler störte. Durch Festlegen von EnableClientScript auf false wurde das Problem behoben.