Не похоже, что есть простая опция, «встроенная» в ASP.NET MVC. Если вы используете пользовательский элемент управления (.ascx), которым вы можете быть, если вы создаете автономные элементы управления, которые также хотят управлять своими собственными требованиями JavaScript, то вы даже не сможете использовать заполнители, чтобы выручить вас.
В конце концов я создал вспомогательный класс и в нем есть пара методов:
private static SortedList<int, string> GetRegisteredScriptIncludes()
{
var registeredScriptIncludes = System.Web.HttpContext.Current.Items["RegisteredScriptIncludes"] as SortedList<int, string>;
if (registeredScriptIncludes == null)
{
registeredScriptIncludes = new SortedList<int, string>();
System.Web.HttpContext.Current.Items["RegisteredScriptIncludes"] = registeredScriptIncludes;
}
return registeredScriptIncludes;
}
public static void RegisterScriptInclude(this HtmlHelper htmlhelper, string script)
{
var registeredScriptIncludes = GetRegisteredScriptIncludes();
if (!registeredScriptIncludes.ContainsValue(script))
{
registeredScriptIncludes.Add(registeredScriptIncludes.Count, script);
}
}
public static string RenderScripts(this HtmlHelper htmlhelper)
{
var registeredScriptIncludes = GetRegisteredScriptIncludes();
var scripts = new StringBuilder();
foreach (string script in registeredScriptIncludes.Values)
{
scripts.AppendLine("<script src='" + script + "' type='text/javascript'></script>");
}
return scripts.ToString();
}
В любом случае, это основная форма, чтобы попытаться показать, как это работает. Его можно улучшить многими способами, но в данный момент он просто отфильтровывает дубликаты запросов на вставку сценария для вас. Всякий раз, когда вы хотите добавить новый скрипт в ascx (или aspx в этом отношении), вы можете сделать это следующим образом:
<%
Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/MapLayer.js"));
Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/Vehicles.js"));
%>
Тогда вам нужно помнить, чтобы вывести их, как только вы закончите. Это достигается путем выполнения следующего вызова в том месте на вашей странице, где вы хотите вывести теги сценария:
<%=Html.RenderScripts() %>
Кажется, до сих пор работает для меня. Я почти не ожидал, что возникнут проблемы с рендерингом, в зависимости от того, в какой момент вызывался RenderScripts, особенно если еще не все из RegisterScriptInclude были вызваны, но пока, похоже, это делает работу. Если вы выполняете сценарии последними, у вас не должно быть проблем.