2008-10-16 6 views
3

J'ai une vue utilisant une page maître qui contient du javascript qui doit être exécuté à l'aide de OnLoad du corps. Quel est le meilleur moyen de configurer OnLoad sur ma MasterPage uniquement pour certaines vues? L'idée que j'ai essayée était de passer le nom de la fonction javascript comme ViewData. Mais je ne veux pas vraiment que mes Contrôleurs connaissent le javascript sur la page. Je n'aime vraiment pas cette approche ...Définition de l'attribut OnLoad du corps dans une page MVC Master Asp.net

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

Edition - Je suppose qu'une idée serait d'utiliser le document jQuery événement prêt à la place ...

D'autres idées?

Répondre

3

J'utilise le modèle suivant avec mon projet en cours MVC et il semble fonctionner assez bon pour mes .js travaillent jusqu'ici ...

Dans mon Maître page je charge mes fichiers de script standard Je veux être utilisé dans toutes mes pages de contenu (des choses comme jquery.js, global.js, jquery-plugins, fichiers .css, etc.). Je définis ensuite les événements nécessaires dans ma page maître (onLoad, onSave, etc.). Chaque page de contenu que je crée aura son propre fichier .js associé et je charge ce fichier de script dans la page de contenu .aspx. Tous les événements .js qui doivent être implémentés différemment entre les pages de contenu sont traités dans le fichier .js de contenu individuel. Donc, fondamentalement, ma page principale a un ensemble de fonctions .js que mes scripts de pages de contenu vont implémenter. En ce moment je stocke juste ces signatures de fonction de modèle de .js dans un dossier et les copie et les colle dans chaque nouveau fichier de content.js que j'ai besoin de créer. Cependant, je pense à la construction d'un générateur de code ou d'un outil qui cracherait ces signatures dans n'importe quel nouveau fichier .js dont j'ai besoin (si .js a une capacité d'interface ou des fonctionnalités d'héritage faites le moi savoir).

Pour résumer:

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

ContentPage Charges: ContentPage.js

Global.js contient des fonctions que le maître la page appelle qui ne change pas entre les pages de contenu avec d'autres fonctions de routine globales. Chaque ContentPage.js implémente ses propres fonctions pour la page de contenu avec les fonctions invoquées par la page maître qui ont un comportement différent.

+0

Merci pour votre suggestion. Je pourrais juste jouer avec cette idée. Si jamais vous créez un outil ou un générateur, assurez-vous de le poster ici! – Vyrotek

0

Vous devriez certainement utiliser jQuery ou un autre framework JavaScript de toute façon. Faites en sorte que vos contrôleurs transmettent un type d'indicateur d'état à vos vues, mais pas aux choses spécifiques aux vues comme les noms des fonctions JavaScript. Il appartient à vos vues de mapper les indicateurs d'état aux noms de fonction JavaScript.

5

Maintenant que JQuery fait officiellement partie d'ASP.NET MVC, je recommande de l'utiliser. C'est petit et ajoute beaucoup de valeur à votre application.

Je recommande d'ajouter la version Mustafa de JQuery qui a les commentaires IntelliSense inclus:

jquery-1.2.6-intellisense.js

Ensuite, ajoutez à votre dossier Scripts (nouveau dans MVC Beta 1), et la référence comme ceci:

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

Dans votre code, vous pouvez maintenant ajouter une fonction comme ceci:

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

Puisque vous avez mentionné que vous voulez que cela se produise dans certains points de vue, vous pouvez ajouter un espace réservé dans votre page maître comme ceci:

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

Ensuite, dans votre vue, vous pouvez choisir de mettre le code là-dedans, ou ne pas.

qui irait à l'intérieur de la section de tête

5

Solution de 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> 
Questions connexes