Domanda

Ho una vista usando una pagina master che contiene alcuni javascript che devono essere eseguiti usando OnLoad of the Body. Qual è il modo migliore per impostare OnLoad sul mio MasterPage solo per determinate visualizzazioni?

Sull'idea che ho provato è stato di passare il nome della funzione javascript come ViewData. Ma non voglio davvero che i miei controller debbano conoscere il javascript nella pagina. Davvero non mi piace questo approccio ...

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

Modifica - Suppongo che un'idea sarebbe quella di utilizzare l'evento pronto per il documento di jQuery invece ...

Altre idee?

È stato utile?

Soluzione

Ho usato il seguente modello con il mio attuale progetto MVC e sembra funzionare abbastanza bene per il mio lavoro .js finora ...

All'interno della mia Pagina Master carico i miei file di script standard che voglio usare in tutte le mie pagine di contenuti (cose come jquery.js, global.js, plug-in jquery, file .css, ecc.). Definisco quindi tutti gli eventi necessari nella mia pagina principale (onLoad, onSave, ecc.). Ogni pagina di contenuto che creerò avrà il proprio file .js associato ad esso e carico quel file di script all'interno della pagina .aspx del contenuto. Qualsiasi evento .js che deve essere implementato in modo diverso tra le pagine di contenuto viene gestito all'interno del singolo file .js di contenuto. Quindi sostanzialmente la mia Pagina Master ha una serie di funzioni .js che implementeranno i miei script della pagina dei contenuti. In questo momento ho semplicemente archiviato quelle firme della funzione .js del modello in un file e le ho copiate e incollate in ogni nuovo file content.js che ho bisogno di creare. Tuttavia, sto pensando di creare un generatore di codice o uno strumento che sputerebbe queste firme modello per me in qualsiasi nuovo file .js che ho bisogno di creare (se .js ha una qualche forma di funzionalità di interfaccia o funzionalità di eredità fammelo sapere).

Quindi, per ricapitolare:

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

Carichi ContentPage: ContentPage.js

Global.js contiene funzioni invocate dalla pagina principale che non cambiano tra le pagine di contenuto insieme ad altre funzioni di routine globali.

Ogni ContentPage.js implementa le proprie funzioni per la pagina di contenuto insieme a quelle funzioni invocate dalla pagina principale che hanno un comportamento diverso.

Altri suggerimenti

Ora che JQuery fa ufficialmente parte di ASP.NET MVC, consiglierei di usarlo. È piccolo e aggiunge tonnellate di valore alla tua applicazione.

Vorrei raccomandare di aggiungere la versione di Mustafa di JQuery con i commenti Intellisense inclusi:

jquery-1.2.6-intellisense. js

Quindi aggiungilo alla cartella Scripts (novità in MVC Beta 1) e fai riferimento in questo modo:

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

Nel tuo codice ora puoi aggiungere una funzione come questa:

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

Dato che hai detto che vuoi che accada solo in determinate viste, puoi aggiungere un segnaposto nella tua Pagina principale in questo modo:

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

Quindi, nella tua vista, puoi scegliere di inserire il codice o meno.

che andrebbe all'interno della sezione head

Soluzione dal blog: Utilizzo body onload con 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>
 

Dovresti assolutamente usare jQuery o un altro framework JavaScript comunque.

Chiedi ai tuoi controller di passare una sorta di indicatore di stato alle tue visualizzazioni, ma non cose specifiche delle viste come i nomi delle funzioni JavaScript. Spetta alle tue visualizzazioni mappare gli indicatori di stato sui nomi delle funzioni JavaScript.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top