2009-08-18 7 views
2

J'ai un tas de fonctions javascript qui dépendent de certaines constantes côté serveur (telles que les chaînes de mon fichier de ressources). Pendant que je les développais, j'ai gardé le code javascript dans l'en-tête de la vue, donc je pouvais simplement utiliser des balises côté serveur dans mon code javascript, mais maintenant je voudrais déplacer les fonctions javascript dans un fichier séparé.Quelle est la meilleure façon d'intégrer des balises côté serveur constantes dans le code javascript?

Je ne peux pas utiliser un fichier js normal car cela ne serait pas interprété par le serveur, ce qui rendrait inutiles les balises de serveur qui y sont intégrées. Je ne veux pas non plus définir de variables dans la page, car cela semble très gênant et sujet aux erreurs. Ce que j'ai fait à la place est de créer un nouveau fichier aspx, y mettre les fonctions javascript et inclure ce fichier aspx au lieu d'un fichier js normal dans mon modèle maître. Cela semble un peu peu orthodoxe, mais cela semble fonctionner correctement.

Y at-il un inconvénient à mon approche que je n'ai pas pris en compte? Ou une meilleure méthode (moins obscure)?

Modifier Question de bonification: Dois-je utiliser un DOCTYPE dans le fichier de scripts inclus? Après tout, le fichier de scripts est déjà inclus par une balise de script. J'ai essayé d'imiter les fichiers js ordinaires, donc je n'ai pas spécifié de DOCTYPE.

Répondre

2

aide une vue, avec les capacités de création de modèles de MVC est un excellent moyen d'y parvenir. Il est facile à maintenir, bien compris et fait le travail rapidement. Le seul vrai truc est de le faire pour servir le bon type de contenu. Faire quelque chose comme ceci:

public ActionResult ConfigurationSettings() 
    { 
     Response.ContentType = "text/javascript"; 
     return View(Configuration); 
    } 

obtient En fait, vous text/html type de contenu. L'astuce est de vous assurer d'obtenir le dernier mot, ajoutez à votre contrôleur:

protected override void Execute(System.Web.Routing.RequestContext requestContext) 
    { 
     base.Execute(requestContext); 
     requestContext.HttpContext.Response.ContentType = "text/javascript"; 
    } 

Et vous obtiendrez le type de contenu correct; ViewResult semble le forcer à aller text/html.

+0

Juste ce que je cherchais - Merci beaucoup! –

3

L'extension de fichier, que ce soit js, aspx, ashx, bla, foo, tout ce qui n'est pas très important. Si vous avez un javascript généré côté serveur qui n'est pas spécifique à une page, alors créer une page ASPX pour afficher le javascript devrait être correct.

Nous utilisons souvent des gestionnaires HTTP pour générer des javvascript dynamiques dans nos systèmes. Nous veillons également à définir les en-têtes de réponse sur text/javascript pour que le navigateur client sache que nous renvoyons javascript.

+0

Merci pour votre réponse. Est-ce que le doctype est vraiment nécessaire (voir ma modification ci-dessus)? Si oui, quelle est la syntaxe exacte des fichiers javascript? Ma recherche google n'a pas été très réussie. –

+0

Le type de document n'est vraiment pas nécessaire du point de vue du navigateur. Nous utilisons souvent des serveurs de cache, tels que akamai, et mettons en place des règles pour mettre en cache certains types de contenu, tels que stylesheets et javvascripts, en utilisant l'en-tête doc type, sans avoir besoin de s'appuyer sur les noms/extensions. –

1

Nous utilisons le ScriptDataBlock control from JsonFx pour émettre des variables dans la page elle-même. Il agit comme un dictionnaire où la clé est le nom de la variable (par exemple "MyNamespace.myVar") et la valeur est une valeur C# normale (y compris les objets entiers). Le contrôle émet la génération d'espace de noms appropriée et la conversion de type en types JavaScript natifs. Donc, dans ce sens, elle finit par ne pas être « maladroit » ou « risques d'erreurs »:

myDataBlock["MyApp.myVar"] = myObject; 

Si vous faites un fichier externe, puis un gestionnaire de .ashx générique est probablement votre meilleur pari. Il sera plus léger qu'une page entière aspx et vous donne un contrôle assez brut sur la sortie. Les choses que vous voulez être sûr de faire sont de définir l'en-tête de réponse "Content-Type" à "text/javascript" (type MIME techniquement incorrect mais le plus commun) et pour Internet Explorer qui ne respecte pas l'en-tête Content-Type, définissez également l'en-tête "Content-Disposition" sur "inline; MyScriptName.js" pour qu'il connaisse l'extension du contenu. De plus, s'il s'agit réellement de «constantes» plutôt que de données calculées à l'exécution, vous devrez définir l'en-tête «Expires» à une date ultérieure pour encourager le navigateur à mettre en cache le résultat. Cela réduira encore les demandes de votre serveur.

Modifier: aucun type de document si vous créez du code JavaScript. DocType est uniquement pour le balisage.

+0

Merci pour votre réponse, mais votre édition me confond. J'ai décidé d'utiliser un fichier asxh comme suggéré et je n'ai mis que du code javascript. Dois-je utiliser un doctype? En outre, quelle est la syntaxe appropriée pour un doctype javascript? J'ai essayé de google, mais je n'ai trouvé aucune information à ce sujet. –

+0

Désolé pour la confusion. Il n'y a pas de DocType pour JavaScript, car les DocTypes sont une déclaration SQML ​​qui décrit les DTD pour valider le balisage. Votre réponse JavaScript ne doit inclure que le script et non le balisage (y compris les balises de script). De cette façon, vous pouvez référencer votre gestionnaire en tant que script externe et le navigateur le téléchargera comme s'il s'agissait d'un fichier statique. – mckamey

+0

Content-Type est l'en-tête qui spécifie le type MIME (par exemple, "text/javascript") alors que DocType est une balise en haut des pages HTML, c'est peut-être le cas. avoir, mais un DocType ne s'applique pas – mckamey

1

Vous utilisez le framework MVC (votre question est balisée comme telle) non?Si oui, vous pouvez créer une action qui retourne une JavaScriptResult qui sera exécutée à la page lors du chargement:

public class JSController : Controller { 
    public ActionResult Headers() { 
     // create your variables here 
     return JavaScript("alert('hi');"); 
    } 
} 

Et vous pouvez ajouter à votre ASPX/page maître:

<script src="/JS/Headers" type="text/javascript"></script> 
+0

Vous avez raison sur la plate-forme que j'utilise. Je suppose que vous voulez dire charger le script à partir d'un fichier js et le renvoyer comme résultat Javascript (l'intégration du script comme une chaîne dans le code du contrôleur serait très moche avec plus de 10 fonctions javascript ...). Malheureusement, cela ne fonctionne pas dans mon scénario sauf si je compile la chaîne de script par chaîne et insère les constantes côté serveur manuellement. Le problème est que le résultat Javascript n'est pas interprété par le serveur, mais simplement transmis au navigateur avec un en-tête de réponse approprié. –

Questions connexes