Question

J'ai une vue utilisant une page maître qui contient du code JavaScript qui doit être exécuté à l'aide du chargement en ligne du corps. Quel est le meilleur moyen de définir OnLoad sur ma page maître uniquement pour certaines vues?

L’idée était d’essayer de transmettre le nom de la fonction javascript sous le nom ViewData. Mais je ne veux pas vraiment que mes contrôleurs soient au courant du javascript de la page. Je n'aime vraiment pas cette approche ...

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

Modifier - Je suppose qu'une idée serait d'utiliser l'événement de préparation de documents de jQuery à la place ...

Avez-vous d'autres idées?

Était-ce utile?

La solution

J'utilise le modèle suivant avec mon projet MVC actuel et il semble fonctionner assez bien pour mon travail .js jusqu'à présent ...

Dans ma page maître, je charge les fichiers de script standard que je souhaite utiliser dans toutes mes pages de contenu (éléments tels que jquery.js, global.js, plugins jquery, 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 chargerai ce fichier script dans la page de contenu .aspx. Tous les événements .js devant être implémentés différemment entre les pages de contenu sont gérés dans le fichier de contenu .js individuel. Donc, fondamentalement, ma page maître possède un ensemble de fonctions .js que mes scripts de page de contenu vont implémenter. À l’heure actuelle, je stocke ces signatures de fonction de modèle .js dans un fichier, puis je les copie / les colle dans chaque nouveau fichier content.js que je dois créer. Cependant, je songe à créer un générateur de code ou un outil qui cracherait ces signatures de modèle dans tout nouveau fichier .js que je devrais créer (si .js dispose d'une fonctionnalité d'interface ou de fonctionnalités d'héritage, laissez-moi savoir).

Donc, pour récapituler:

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

Charges ContentPage: ContentPage.js

Global.js contient des fonctions invoquées par la maquette qui ne changent pas entre les pages de contenu, ni aucune autre fonction de routine globale.

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.

Autres conseils

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

Je recommanderais d'ajouter la version de JQuery de Mustafa contenant les commentaires d'Intellisense inclus:

jquery-1.2.6-intellisense. js

Ajoutez-le ensuite à votre dossier Scripts (nouveauté dans la version bêta 1 de MVC) et faites-le comme suit:

<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 celle-ci:

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

Puisque vous avez indiqué que vous souhaitiez que cela ne se produise que dans certaines vues, vous pouvez ajouter un espace réservé dans votre page maître, comme suit:

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

Ensuite, dans votre vue, vous pouvez choisir d'y insérer du code ou non.

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

Solution du blog: Utilisation body onload avec 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>
 

De toute façon, vous devriez absolument utiliser jQuery ou un autre framework JavaScript.

Demandez à vos contrôleurs de transmettre un type d’indicateur d’état à vos vues, mais pas des éléments spécifiques à des vues comme les noms des fonctions JavaScript. Il vous appartient de mapper les indicateurs d'état sur les noms de fonctions JavaScript.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top