Die Site, an der ich gerade arbeite, verwendet ein Databound-asp: Menu-Steuerelement. Beim Senden von 1 Menüeintrag wird HTML gerendert, das in Firefox (und IE) absolut korrekt ist, aber in Safari und Chrome wirklich versaut. Unten ist der Code, der an jeden Browser gesendet wurde. Ich habe es ein paar Browser getestet, und sie sind alle ziemlich ähnlich gerendert, so dass ich nur die beiden Variationen auf der Rendering-Quelle posten.
Meine Frage ist: Wie bekomme ich ASP.NET, um das gleiche HTML und Javascript an Chrome und Safari zu senden wie an Firefox und IE?
%Vor%Update: Mein Lösungsbeitrag ist korrekt .. aber ich kann mein eigenes nicht als korrekt markieren ... also wenn jemand es kopieren möchte, kann ich das schließen. :)
Ich fand diese Lösung aus einem Kommentar zu weblogs.asp.net . Es könnte ein Hack sein, aber es funktioniert.
Dieser Cross-Browser-Kompatibilitätskampf wird ärgerlich.
%Vor%Wenn jemand eine bessere Lösung hat, die nicht so sehr ein Hack ist, wäre ich dankbar, wenn Sie es gepostet hätten. Und bei meinen umfangreichen Websuchen sieht es so aus, als ob ich nicht alleine mit diesem Problem mit der Menüsteuerung stünde, also würden einige gute Referenzen anderen in der gleichen Situation helfen.
Ich hatte auch Probleme mit der ASP: Menüsteuerung und dem Webkit. Außerdem ist es schwierig, genau so zu gestalten, wie ich es möchte. Meine Empfehlung ist die Verwendung der CSS Friendly Control Adapter:
Dies wandelt die Tabelle des Menüs in viel moderneres und SEO-freundliches Markup um. Ihr Menü wird mehr wie folgt aussehen:
%Vor%Bei meinen Tests ist das Markup in allen Browsern gleich.
Hier ist der einfachste Weg, um dieses Problem für Chrome und Safari zu beheben, wenn Sie mehrere Web-Apps haben:
Erstellen Sie eine Datei mit dem Namen safari.browser in "% SystemRoot% \ Microsoft.NET \ Framework [version] \ CONFIG \ Browsers", die Folgendes enthält:
%Vor%Dadurch wird asp.net angewiesen, beim Rendern der Menüsteuerung für Safari keinen Adapter zu verwenden. Safari1Plus wird am Ende der Datei mozilla.browser im selben Verzeichnis definiert. Dies funktioniert auch für Chrome, da beide Webkit verwenden, so wie asp.net Safari1Plus identifiziert.
Führen Sie als Nächstes% SystemRoot% \ Microsoft.NET \ Framework [Version] \ aspnet_regbrowsers -i
ausDadurch werden alle Browserdateien in eine Assembly kompiliert und zum GAC hinzugefügt.
Jetzt wird das asp.net Menü in Safari und Chrome korrekt gerendert.
Alternativ können Sie die Datei das Verzeichnis App_Browsers in jeder Ihrer Web-Anwendungen hinzufügen.
Ich wollte nur eine alternative Option einreichen. Dies funktioniert für ASP.NET 3.5.
Fügen Sie in der Browserdatei den folgenden Code zwischen dem <browsers>
-Tag ein:
<browser id="Chrome" parentID="Safari1Plus">
<controlAdapters>
<adapter controlType="System.Web.UI.WebControls.Menu" adapterType="" />
</controlAdapters>
</browser>
Das sollte die Menüsteuerung in Chrome / Safari richtig wiedergeben.
Mayank Sharma eine Lösung gefunden, die mit Masterseiten arbeitet, anstatt einzelne Seiten zu bearbeiten. Alle Seiten, die die Masterseite verwenden, werden nahtlos fixiert. Es ist immer noch ein Hack, aber Sie tun, was Sie tun müssen. Hier ist ein Barebone-Beispiel für den Master-Page-Code.
%Vor%Hier ist die @Mayank Sharma / @jball C # -Version, die in VB.NET konvertiert wurde. Danke für die Fix Jungs, die mich seit Monaten nervt. Mein Problem war, dass jeder Browser auf MAC und PC funktionierte, außer IE8 und Chrome. Aber Chrome, so wie ich es mag, lässt Google Docs oft nicht laufen - arbeiten Sie das aus !!!
%Vor%Sie werden feststellen, dass ich nach "fake_user_agent", nicht nach "Safari" suchen musste.
Das Problem, dass Chrome und Safari das Menüsteuerelement nicht richtig gerendert haben, ist darauf zurückzuführen, dass das Navigationsfeld skiplink image von Chrome und Safari gerendert wird.
Wenn Sie ein css display: none;
auf dem Bild für den Skiplink machen, positioniert sich das Menü-Steuerelement wie gewünscht.
Ich habe dies in einem einfachen 1-Level-Menü und nicht in verschachtelten Menüs getestet.
Das Hinzufügen von ClientTarget="uplevel"
zur Seiten-Direktive macht Safari zur Arbeit: