Semble très similaire à cette question: Lier les Bibliothèques JavaScript dans les Contrôles Utilisateur
Je vais reposter ma réponse à cette question ici.
Je serais certainement vous déconseillons de les mettre à l'intérieur de partiels exactement pour la raison que vous mentionnez. Il y a une forte chance que l'on pourrait tirer dans deux partiels qui ont tous deux des références pour le même fichier js. Vous avez aussi l'impact sur les performances de chargement js avant de charger le reste de l'html.
Je ne sais pas à propos de les meilleures pratiques, mais j'ai choisi d'inclure commune, js fichiers à l'intérieur de la masterpage et puis de définir une distinct ContentPlaceHolder pour avoir un peu de js fichiers qui sont spécifiques d'un particulier ou d'un petit nombre de points de vue.
Voici un exemple de page maître - c'est assez explicite.
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
<head runat="server">
... BLAH ...
<asp:ContentPlaceHolder ID="AdditionalHead" runat="server" />
... BLAH ...
<%= Html.CSSBlock("/styles/site.css") %>
<%= Html.CSSBlock("/styles/ie6.css", 6) %>
<%= Html.CSSBlock("/styles/ie7.css", 7) %>
<asp:ContentPlaceHolder ID="AdditionalCSS" runat="server" />
</head>
<body>
... BLAH ...
<%= Html.JSBlock("/scripts/jquery-1.3.2.js", "/scripts/jquery-1.3.2.min.js") %>
<%= Html.JSBlock("/scripts/global.js", "/scripts/global.min.js") %>
<asp:ContentPlaceHolder ID="AdditionalJS" runat="server" />
</body>
Html.CSSBlock Et Html.JSBlock sont bien évidemment mes propres extensions, mais encore une fois, ils sont explicites dans ce qu'ils font.
Puis en dire un Inscription.aspx vue j'aurais
<asp:Content ID="signUpContent" ContentPlaceHolderID="AdditionalJS" runat="server">
<%= Html.JSBlock("/scripts/pages/account.signup.js", "/scripts/pages/account.signup.min.js") %>
</asp:Content>
HTHs, Charles
Ps. Voici un suivi de la question que j'avais posée sur les minifying et concaténation de fichiers js:
Concaténer & Rapetisser JS à la volée OU au moment de la construction - ASP.NET MVC
EDIT: Comme l'a demandé sur mon autre réponse, mon implémentation .JSBlock(a, b) comme demandé
public static MvcHtmlString JSBlock(this HtmlHelper html, string fileName)
{
return html.JSBlock(fileName, string.Empty);
}
public static MvcHtmlString JSBlock(this HtmlHelper html, string fileName, string releaseFileName)
{
if (string.IsNullOrEmpty(fileName))
throw new ArgumentNullException("fileName");
string jsTag = string.Format("<script type=\"text/javascript\" src=\"{0}\"></script>",
html.MEDebugReleaseString(fileName, releaseFileName));
return MvcHtmlString.Create(jsTag);
}
Et puis, là où la magie opère...
public static MvcHtmlString MEDebugReleaseString(this HtmlHelper html, string debugString, string releaseString)
{
string toReturn = debugString;
#if DEBUG
#else
if (!string.IsNullOrEmpty(releaseString))
toReturn = releaseString;
#endif
return MvcHtmlString.Create(toReturn);
}