Festlegen des OnLoad-Attributs des Körpers in einer Asp.net MVC-Masterseite

Ich habe eine Ansicht mit einer Masterseite, die einige Javascript enthält, die mit dem OnLoad des Körpers ausgeführt werden muss. Wie kann ich OnLoad auf meiner MasterPage am besten nur für bestimmte Ansichten festlegen?

Auf Idee versuchte ich, den Namen der Javascript-Funktion als ViewData zu übergeben. Aber ich möchte nicht wirklich, dass meine Controller über das Javascript auf der Seite Bescheid wissen müssen. Ich mag diesen Ansatz wirklich nicht...

<body onload="<%=ViewData["Body_OnLoad"]%>">
<asp:ContentPlaceHolder ID="MainContent" runat="server" />

Bearbeiten - Ich nehme an, eine Idee wäre, stattdessen das dokumentbereite Ereignis von jQuery zu verwenden...

Andere Ideen?

Antwort auf "Festlegen des OnLoad-Attributs des Körpers in einer Asp.net MVC-Masterseite " 4 von antworten

Sie sollten auf jeden Fall jQuery oder ein anderes JavaScript-Framework verwenden.

Lassen Sie Ihre Controller eine Art Statusanzeige an Ihre Ansichten übergeben, aber nicht an ansichtenspezifische Dinge wie die Namen von JavaScript-Funktionen. Es liegt an Ihren Ansichten, Statusindikatoren JavaScript-Funktionsnamen zuzuordnen.

Ich habe das folgende Muster mit meinem aktuellen MVC-Projekt verwendet und es scheint ziemlich gut für meine .js Arbeit zu funktionieren, bis jetzt...

Innerhalb meiner Master-Seite lade ich meine Standard-Skriptdateien auf, die ich in allen meinen Inhaltsseiten verwenden möchte (Dinge wie jquery.js, global.js, jquery-plugins, .css Dateien, etc.). Ich definiere dann alle Ereignisse, die auf meiner Masterseite benötigt werden (onLoad, onSave, etc.). Jeder Inhaltsseite, die ich erstelle, ist eine eigene JS-Datei zugeordnet, und ich lade diese Skriptdatei in die Inhalts -ASPX-Seite. Alle JS-Ereignisse, die zwischen Inhaltsseiten unterschiedlich implementiert werden müssen, werden in der datei "individuelle Content .js" behandelt. Also im Grunde meine Master-Seite hat eine Reihe von .js Funktionen, die meine Inhaltsseite Skripte implementieren. Im Moment speichere ich nur diese Template .js-Funktionssignaturen in einer Datei und kopiere sie und füge sie in jede neue content.js-Datei ein, die ich erstellen muss. Ich denke jedoch darüber nach, einen Codegenerator oder ein Tool zu erstellen, das diese Vorlagensignaturen für mich in jeder neuen JS-Datei ausspucken würde, die ich erstellt habe (wenn JS irgendeine Form von Schnittstellenfähigkeit oder Vererbungsfunktionen hat, lassen Sie es mich wissen).

So to recap:

MasterPage.Master Loads: jquery.js, global.js, plugins.js

ContentPage Loads: ContentPage.js

Global.js enthält Funktionen, die die Masterseite aufruft, die sich nicht zwischen Inhaltsseiten zusammen mit anderen globalen Routinefunktionen ändern.

Jede ContentPage.js implementiert ihre eigenen Funktionen für die Inhaltsseite zusammen mit den Funktionen, die die Masterseite aufruft und unterschiedliches Verhalten aufweist.

Da JQuery nun offiziell Teil ASP.NET MVC ist, würde ich empfehlen, es zu verwenden. Es ist klein und fügt Ihrer Anwendung einen Tonnen von Wert hinzu.

Ich würde empfehlen, Mustafas Version von JQuery hinzuzufügen, die die Intellisense-Kommentare enthält:

jquery-1.2.6-intellisense.js

Dann fügen Sie es Ihrem Scripts-Ordner hinzu (neu in MVC Beta 1), und verweisen Sie darauf wie folgt:

<script language="javascript" type="text/javascript" src="../../Scripts/jquery-1.2.6-intellisense.js"></script> 

In Ihrem Code können Sie jetzt eine Funktion wie diese hinzufügen:

$(document).ready(function() {
   // do stuff when DOM is ready
});

Da Sie erwähnt haben, dass es nur in bestimmten Ansichten passieren soll, könnten Sie einen Platzhalter in Ihrer Master-Seite wie diese hinzufügen :

<asp:contentplaceholder id="JavascriptPlaceholder" runat="server"></asp:contentplaceholder>  

Dann in Ihrer Ansicht, sie könnten wählen, um Code dort zu setzen, oder nicht.

, das in den Kopfteil

gehen würde

Lösung aus dem Blog: Using body onload with ASP.net 2.0 MasterPages

MasterPage.master

<head>
<asp:ContentPlaceHolder runat="server" id="Headers">
</asp:ContentPlaceHolder>
<script language=javascript>
   function mp_onload() {
     if(window.body_onload != null)
     window.body_onload();
   }
</script>
</head>
<body onload="mp_onload();">

Default.aspx

<asp:Content ID="Content2" ContentPlaceHolderID="Headers" Runat="Server">
<script language="javascript">
   function body_onload()
   {
       //do something
   }
</script>
</asp:Content>