VS2012 - Веб-формы - путаница пула
Я создал новый проект ASP.NET Web Forms через Visual Studio 2012. К сожалению, файл Site.Master по умолчанию очень запутан. (Я отправляю эти вопросы вместе, потому что они очень связаны и содержат ссылки на один и тот же код.)
Во-первых, я уже понимаю цель связывания и минимизации, поэтому нет необходимости обсуждать это. Однако я не понимаю, что происходит с тем, как скрипты включаются в главную страницу по умолчанию.
Вопрос 1:
Почему в файле BundleConfig.cs создается пакет "~/bundles/WebFormsJs", и все же на главной странице каждый из этих же отдельных .js файлов отображается один за другим в ScriptManager?
Внутри BundleConfig.cs:
bundles.Add(new ScriptBundle("~/bundles/WebFormsJs").Include(
"~/Scripts/WebForms/WebForms.js",
"~/Scripts/WebForms/WebUIValidation.js",
"~/Scripts/WebForms/MenuStandards.js",
"~/Scripts/WebForms/Focus.js",
"~/Scripts/WebForms/GridView.js",
"~/Scripts/WebForms/DetailsView.js",
"~/Scripts/WebForms/TreeView.js",
"~/Scripts/WebForms/WebParts.js"));
Inside Site.Master:
<body>
<form runat="server">
<asp:ScriptManager runat="server">
<Scripts>
<%--Framework Scripts--%>
<asp:ScriptReference Name="MsAjaxBundle" />
<asp:ScriptReference Name="jquery" />
<asp:ScriptReference Name="jquery.ui.combined" />
<asp:ScriptReference Name="WebForms.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebForms.js" />
<asp:ScriptReference Name="WebUIValidation.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebUIValidation.js" />
<asp:ScriptReference Name="MenuStandards.js" Assembly="System.Web" Path="~/Scripts/WebForms/MenuStandards.js" />
<asp:ScriptReference Name="GridView.js" Assembly="System.Web" Path="~/Scripts/WebForms/GridView.js" />
<asp:ScriptReference Name="DetailsView.js" Assembly="System.Web" Path="~/Scripts/WebForms/DetailsView.js" />
<asp:ScriptReference Name="TreeView.js" Assembly="System.Web" Path="~/Scripts/WebForms/TreeView.js" />
<asp:ScriptReference Name="WebParts.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebParts.js" />
<asp:ScriptReference Name="Focus.js" Assembly="System.Web" Path="~/Scripts/WebForms/Focus.js" />
<asp:ScriptReference Name="WebFormsBundle" />
<%--Site Scripts--%>
</Scripts>
</asp:ScriptManager>
Как вы можете видеть... каждый из тех же .js файлов отдельно указан в ScriptManager. Я даже не вижу ссылки на пакет "WebFormsJs", который был создан где-то вне BundleConfig.cs. Почему этот пакет когда-либо создавался, если каждый из этих файлов javascript будет упоминаться отдельно здесь в ScriptManager?
Вопрос 2:
Почему ScriptManager используется таким образом вообще? Я был под впечатлением, что ScriptManager был необходим для Microsoft Ajax, например, с помощью UpdatePanels. Какова цель использования ScriptManager здесь... просто для регистрации файлов javascript?
Вопрос 3:
В чем разница в регистрации файлов javascript с помощью ScriptManager в сравнении с вверху сайта Site.Master, где вместо этого используется следующий подход?
<%: Scripts.Render("~/bundles/modernizr") %>
Вопрос 4:
Внутри ScriptManager я также заметил:
<asp:ScriptReference Name="MsAjaxBundle" />
<asp:ScriptReference Name="jquery" />
<asp:ScriptReference Name="jquery.ui.combined" />
... Я могу хотя бы распознать "MsAjaxBundle" из BundleConfig.cs, но где определены jquery и jquery.ui.combined? Я выполнил поиск и нашел ссылку на них в packages.config.
<package id="jQuery" version="1.7.1.1" targetFramework="net45" />
<package id="jQuery.UI.Combined" version="1.8.20.1" targetFramework="net45" />
Но я не понимаю, что здесь происходит. Я думал, что package.config используется для NuGet. Плюс... Я даже не вижу путь, указанный здесь для расположения этих jQuery.js файлов. Они перечислены здесь и странно связаны с определенной версией .NET Framework (4.5 в моем случае). Почему ресурс javascript будет связан с версией .NET Framework вне меня.
В любом случае вопрос 4 таков: как добавляется/используется ресурс "jquery" в ScriptManager? Почему я не вижу файлы jQuery.js, сгруппированные вместе в BundleConfig.cs, как и все остальные пакеты?
Вопрос 5:
Можно ли удалить следующую ссылку script из Site.Master, если я не планирую использовать UpdatePanel и те элементы управления Microsoft Ajax? Я немного смущен, почему это по-прежнему включено здесь по умолчанию.
<asp:ScriptReference Name="MsAjaxBundle" />
Ответы
Ответ 1
ОБНОВЛЕНИЕ: Это новое сообщение в блоге, которое также говорит об этом подробнее: статья ASP.NET
В основном webforms + bundling выглядит так из-за кучи унаследованного поведения, которое мы не смогли изменить в scriptmanager.
В отношении ваших конкретных вопросов:
-
В основном это так, что дедупликация работает правильно, script у менеджера есть ограничение для исходных ресурсов script, которые мешают им быть сценарием, поэтому они должны быть сопоставлены на диске, который затем правильно деблокируется, поскольку файлы уже включены в комплект.
WebformsBundleJs - это сопоставление script, которое создается внутри кода PreAppStart внутри nupkgs ScriptManager. (Я согласен, что это почти невозможно обнаружить)
-
Новые функции 4.5, такие как ненавязчивая проверка, требуют jquery (через scriptmanager), поэтому менеджер script был использован для обеспечения того, чтобы jquery не отображался дважды.
-
Это будет работать отлично, но он никогда не будет дедуплироваться с помощью ScriptManager. Так что для modernizr это не будет проблемой.
-
Пакеты jquery переносят файлы jquery на диск в папку Scripts.
-
Эта ссылка тянет в msajaxbundle, который содержит все сценарии ajax, если вам не нужны/нужны, я думаю, что его можно удалить.
Ответ 2
У меня были более-менее одинаковые вопросы...
Однако по вопросу 4 у меня другое мнение.
WebFormsBundle и MsAjaxBundle являются ссылками Script, которые были определены в PreAppStatCode (например, я не могу найти, где этот файл).
Итак, у меня такое ощущение, что в том же месте (ScriptManager.WebForms PreAppStartCode) по умолчанию есть другое определение для jQuery и jQueryUI Script reference. Эти ссылки используются в менеджере Script.
Этот процесс очень важен, потому что таким образом вы используете некоторые важные функции, такие как CDN и т.д. В определении jquery в PreAppStartCode для этой конкретной ссылки существует определенный путь CDN, который будет использоваться в случае, если вы активируете EnableCDN в менеджере Script главной страницы (EnableCdn = "true" )
Ответ 3
Просто, чтобы прояснить что-то из объяснения ответа accept для Вопроса 1:
Причиной ссылок script для отдельных файлов js веб-форм является то, что локальные файлы (такие как "~/Scripts/WebForms/WebForms.js" ) переопределяют те же файлы, которые существуют в системе. Web.dll(Если вы отражаете System.Web.dll и смотрите в папке с ссылками, вы найдете те же .js файлы).