2011-09-26 3 views
0

Une vue partielle que j'utilise nécessite l'inclusion de certaines bibliothèques jQuery, et j'essaie actuellement de trouver le meilleur moyen de les ajouter.ASP.NET MVC 3 Vue partielle du rasoir - jQuery Inclus dans la disposition principale

Ma configuration actuelle est la suivante:

_Layout.cshtml:

... 
@if (ViewBag.jQuery) 
{ 
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" 
      type="text/javascript"></script> 
} 
... 

Index.cshtml:

... 
@{ Html.RenderPartial("PartialView", 
     new MVCModel.Models.MyModel(), 
     new ViewDataDictionary { { "ViewBag", ViewBag } }); } 
... 

PartialView.cshtml:

... 
@{ 
    if (ViewBag.ViewBag != null) 
    { 
     var vb = (dynamic)ViewBag.ViewBag; 
     vb.jQuery = true; 
    } 
} 
... 

Alors, que J'essaie de faire est "tu rn sur "la bibliothèque dans la vue partielle, et que ce booléen se propage jusqu'à la disposition principale. Cela fait en sorte que je puisse activer la librairie autant que je veux quand je veux (beaucoup de vues partielles, ou une vue utilisée plusieurs fois), mais elle ne sera incluse qu'une seule fois. En plus de cela, j'ai le contrôle sur l'ordre des inclusions, donc je peux m'assurer que les dépendances de fichiers sont incluses en premier.

Je me demandais simplement s'il y avait une meilleure façon de le faire.

En ce moment, mes deux plus grands problèmes sont les suivants:

  1. Le ViewBag n'est pas fortement typé, donc IntelliSense ne me dira pas que les bibliothèques sont disponibles pour moi.
  2. En passant le ViewBag à la vue partielle, juste pour pouvoir le réutiliser.

Répondre

1

Voici un moyen simple d'atteindre votre objectif.

Il existe une fonction dans les vues MVC Razor appelée RenderSection. Il a une syntaxe comme

@RenderSection ("occasionalScripts", false) 

(occasionalScripts est le nom de la section et du faux signifie que la section est facultative et peut ne pas apparaître dans chaque page.)

Vous souhaitez inclure dans votre _Layout.cshtml qui est Views\Shared. Cela permettra à votre modèle de script principal d'afficher une section avec vos définitions de script si vous l'avez défini pour une vue particulière.

Généralement, vous voulez mettre cela au bas de votre page juste avant la fermeture </body>. (Ceci est une meilleure pratique pour la performance.) Je listerais tous mes autres scripts (ceux qui se chargent sur chaque page) juste au-dessus. La raison en est que l'ordre de chargement des scripts jQuery est très important.

Dans chacun de vos vues où vous avez des scripts spéciaux, ajoutez ce qui suit:

@section occasionalScripts { 
... put script references here 
} 

Si vous avez une vue qui ne nécessite pas des scripts spéciaux, vous n'avez pas besoin d'inclure cette section là. Le false sur la balise @RenderSection permet d'accueillir toutes les vues où la balise @section est manquante.

Sur chaque page où cette fonctionnalité est implémentée, vous pouvez sélectionner différents scripts.

En option, vous pouvez définir plusieurs sections pour différentes catégories de fichiers.

-1

J'ai généralement une approche différente, et considèrent que toutes les bibliothèques utilisées sur le site Web doivent être référencés sur chaque page. Cela rend la première charge un peu plus lente, mais le chargement de toutes les pages suivantes est plus rapide, car il utilise le cache du navigateur.

Pour améliorer encore mieux, vous pouvez rendre toutes vos bibliothèques disponibles dans un seul fichier. J'ai utilisé SquishIt pour cela à un moment donné. Je m'intègre plutôt bien dans ASP.NET MVC.

+0

Référencer toutes les bibliothèques sur chaque page n'est pas une bonne idée si les bibliothèques ne sont nécessaires que sur quelques pages. Cela gaspille inutilement de la bande passante et complique la page. –

+0

Je ne suis pas d'accord. Je pense qu'il ne gaspille pas de bande passante pour compresser TOUTES vos références et que le navigateur client le télécharge une seule fois (une seule requête au lieu d'une par bibliothèque) et s'appuie sur le cache du navigateur. Et je ne vois pas comment cela complique la page ... le charger différemment sur chaque page complique la maintenance ... – tsimbalar

+0

Cela dépend du nombre de fichiers que vous téléchargez et si vous avez vraiment besoin de tous ces fichiers sur chaque page. Il y a plusieurs fois que j'ai plus de 20 fichiers Javsascript qui sont utilisés sur des pages différentes. Il n'y a absolument aucune raison d'avoir tous ces éléments sur chaque page - en particulier si un utilisateur est peu susceptible de visiter des pages qui nécessitent certains des fichiers. De plus, lorsque vous faites beaucoup de jQuery, vous courez le risque de collisions et d'autres problèmes. Et ... il n'y a rien qui empêche la minification de tous vos fichiers. De plus, plusieurs fichiers minifiés peuvent être chargés simultanément. –

Questions connexes