Я бы определенно не советовал ставить их внутри партиалов именно по той причине, которую вы упомянули. Существует высокая вероятность того, что одно представление может получить две партиалы, которые имеют ссылки на один и тот же файл js. Вы также получили снижение производительности при загрузке js перед загрузкой остальной части html.
Я не знаю о наилучшей практике, но я решил включить в общую страницу любые распространенные js-файлы, а затем определить отдельный ContentPlaceHolder для некоторых дополнительных js-файлов, относящихся к конкретному или небольшому количеству просмотров.
Вот пример главной страницы - она довольно понятна.
<%@ 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 & Html.JSBlock, очевидно, являются моими собственными расширениями, но опять же, они говорят сами за себя в том, что они делают.
Тогда, скажем, в представлении SignUp.aspx у меня будет
<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. Я бы согласился с тем, что Эндрю сказал, что любой общий JS, определенный непосредственно внутри главной страницы, должен быть объединен и минимизирован.
РЕДАКТИРОВАТЬ: Моя реализация .JSBlock (a, b) в соответствии с просьбой
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);
}
А потом, где происходит волшебство ...
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);
}