2010-08-06 19 views
5

In meiner Website verwende ich die standardmäßige ASP.NET-Menüsteuerung. Ich bin bereits so weit gekommen, einen benutzerdefinierten Steueradapter zu schreiben, um die ziemlich klebrige HTML-Ausgabe loszuwerden, die vom Standardsteueradapter erzeugt wird.JavaScript-Generierung durch ASP.NET-Menüsteuerung deaktivieren

Eine Sache hält mich aber immer noch nervig. Irgendwie erzeugt ASP.NET extra Javascript, das ich nicht brauche und nicht für meine Menüsteuerelemente brauche, da ich keine der dynamischen Funktionen im Steuerelement verwenden werde. Ich habe den Steuerungsadapter ersetzt, sodass kein kompatibles HTML dafür generiert wird.

Jeder hat eine Idee, wie ich verhindern kann, dass ASP.NET das zusätzliche Javascript für die Menüsteuerung generiert?

Antwort

4

Dieses Problem abgeschnitten, nachdem mit der Installation von auf ASP.net 4.0 aktualisierte für mich vs 2010. Das Update ist entweder das Menü zu zwingen als Tisch zu machen oder zu Abschaltzeit die neuen CSS/Javascript "Funktionen", die 4.0 hinzufügt. Die Einstellung des RenderingMode-Attributs des Menüs auf "Tabelle" hat dieses Problem für mich behoben, obwohl ich einen Menüadapter verwende, um das Steuerelement mit Listen zu rendern.

<asp:Menu ID="mnuStuff" runat="server" RenderingMode="Table"> 
    ... 
</asp:Menu> 

Sie können diese Seite weite Einstellung controlRenderingCompatibilityVersion tun, um 3,5 in der web.config:

<system.web> 
    <pages controlRenderingCompatibilityVersion="3.5"/> 
</system.web> 

Dies wird die Wiedergabe von Inline beseitigen JavaScript, das asp in der Basis der Seite injiziert.

0

Ich plane nur nach 2 Stunden Suche nach einer ähnlichen Frage zu stellen und habe kein Glück.

Was ich will, ist die Verwendung der jquery superfish Plugin, wie ich will, dass seine Animation für glattes suchen. Und mit dem ASP.NET-generierten Javascript wird der Superfish einfach nicht funktionieren.

Und schließlich versuche ich das ASP.NET Menu Kontrolle des Attributs zu setzen Aktiviert = false

und die outcoming Quelle wird dies:

new Sys.WebForms.Menu({ element: 'mysitemeun', disappearAfter: 500, orientation: 'horizontal', tabIndex: 0, disabled: **true** }); 

Nach den Code Tracing, das Setzen sie deaktiviert haben noch einige Stiländerungen im Menü, aber es wird kein Ereignis zum MenuItem hinzugefügt. Und die Superfish Animation funktioniert jetzt.

if (!this.container.disabled) { 
    Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover); 
    Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout); 
} 
+0

Es tut mir leid, aber das ist immer noch mit Javascript. Ich möchte das Javascript vollständig entfernen. –

+0

Es tut mir leid, ich kann auch keinen Weg finden, aber nur um Ihnen zu sagen, dass ich nach der obigen Einstellung zumindest die Kontrolle über Jquery und Superfish übernehmen kann. – Benedict

2

Wenn Sie es vorziehen, mit ASP.Net 4.0 Kontrolle zu halten Rendern Sie ein benutzerdefiniertes Menü erstellen können (von System.Web.UI.WebControls.Menu abgeleitet) und ersetzen Sie die OnPreRender:

public class MyCustomMenu : Menu 
{ 
    protected override void OnPreRender(EventArgs e) 
    { 
     // Don't call base OnPreRender 
     //base.OnPreRender(e); 
    } 
} 

Das ist das tat Trick.

+1

Wie benutzt man dieses Code-Snippet ?? –

+0

Die folgende Antwort auf eine ähnliche Frage half mir, diese Lösung zu implementieren: http://stackoverflow.com/questions/232934/subclassing-dropdownlist-in-asp-net – saturdayplace

1

Eine alternative Möglichkeit, das Menüstartskript loszuwerden, besteht darin, die Scriptmethode RegisterStartup vor dem Menu PreRender-Ereignis mit demselben Skriptschlüssel aufzurufen und ein Dummy-Skript (oder ein leeres Skript) auszugeben.

Dies beruht auf internen Implementierungsdetails des mit Reflektor erkannten Menütyps, ist also etwas fragil.

Zum Beispiel kann eine statische Klasse, die wie etwas aussieht:

static MenuHelper 
{ 
    private static Type _rendererType = 
      typeof(Menu).Assembly.GetType(
       typeof(Menu).FullName + "+MenuRendererStandards" 
      ); 

    public static void RemoveMenuScript(Menu menu) 
    { 
     string dummyScript = "<!-- Removed Menu Startup script -->"; 
     string key = "_registerMenu_" + menu.ClientID; 
     ScriptManager.RegisterStartupScript(menu, _rendererType, key, dummyScript, false); 
    } 
} 

Sie brauchen dann nur Sie MenuHelper.RemoveMenuScript(menu) rufen stellen Sie sicher, bevor die PreRender Ereignis-Menü.

Das OP verwendet einen Adapter, so dass Tim Santefords Antwort in seiner Situation besser ist. Wenn Sie jedoch ein statisches Menü als Liste ohne den Startup-Code und ohne den Aufwand zum Schreiben eines Adapters darstellen möchten, ist dies möglicherweise eine Alternative.

1
<script type="text/javascript"> 
    Sys.WebForms.Menu = ""; 
</script> 

es funktioniert ..

Verwendung in aspx Seite

+0

Great Vorschlag, aber es verursacht einige JavaScript-Fehler - die Funktion neu zu definieren, dh 'Sys.WebForms.Menu = function() {};' macht den gleichen Trick, aber verursacht diese Fehler nicht. Siehe: http://stackoverflow.com/a/3264250/1020271 – Moo

Verwandte Themen