Как использовать компоновку и минимизацию ASP.NET без перекомпиляции?

Ограничения: я не использую MVC, просто обычные ol..aspx файлы в своем веб-приложении. Не использовать мастер-страницы - каждая страница - это другой зверь, поэтому решение для меня не подходит.

В большинстве примеров, которые я прочитал для объединения и минимизации, требуется либо специальная разметка MVC, либо требуется идентифицировать связанные скрипты/таблицы стилей спереди, а затем обратиться к этим пакетам. Я хочу избежать перекомпиляции библиотек DLL каждый раз, когда я добавляю или изменяю ссылку .js на странице .aspx.

Мне немного не нравится чтение документов Msft.. есть ли способ (например, элемент управления ASP.NET), что я могу просто обернуть серию тегов script (или тегов link для CSS) в создавать и использовать пакет динамически? Я не хочу изобретать колесо, но серьезно подумываю о создании собственного пользовательского элемента управления/пользовательского элемента управления, который обрабатывает это. Существуют ли другие варианты?

Например, ищем что-то вроде этого:

<asp:adhocscriptbundle id="mypage_bundle" runat="server">
 
 
 
</asp:adhocscriptbundle>

что при включении связывания автоматически заменяет содержимое asp:AdHocScriptBundle единственным тегом script, который напоминает это:

И когда Bundling отключен, выводит содержимое обычно следующим образом:

Любые мысли?

О том, чтобы катиться самостоятельно, но если уже есть решение для этого, пожалуйста, поделитесь, спасибо!

3 ответа

Я закатил свое решение, и он отлично работает! Я создал 4 класса, которые я могу использовать в качестве настраиваемых элементов управления сервером:

  • ScriptBundle
  • Script
  • StyleBundle
  • Ссылка

Эти функции вызова вокруг моей настраиваемой библиотеки связок, которая сама по себе является оберткой для API System.Web.Optimization.

Во время рендеринга ScriptBundle и StyleBundle я затем проверяю внутренний параметр (тот же, который я использую для установки EnableOptimizations в API System.Web.Optimization API), который сообщает этой странице, чтобы либо использовать связывание, либо просто напишите обычные теги script/link. Если Bundling включен, он вызывает эту функцию из моей собственной библиотеки связывания (для скриптов, аналогичный код для Styles tho. Bundler в коде ниже - это класс для моей собственной библиотеки связывания - на всякий случай Microsoft изменяет API System.Web.Optimization Мне нужен слой между ними, так что мне не пришлось бы менять свой код так же):

public static void AddScriptBundle(string virtualTargetPath, params string[] virtualSourcePaths)
 {
 var scriptBundle = new System.Web.Optimization.ScriptBundle(virtualTargetPath);
 scriptBundle.Include(virtualSourcePaths);
 System.Web.Optimization.BundleTable.Bundles.Add(scriptBundle);
 }

Чтобы убедиться, что я создаю только Bundle, если он еще не существует, я сначала проверяю Bundle с помощью этого метода (перед использованием вышеописанного метода):

public static bool BundleExists(string virtualTargetPath)
 {
 return System.Web.Optimization.BundleTable.Bundles.GetBundleFor(virtualTargetPath) != null;
 }

Затем я использую эту функцию, чтобы вытолкнуть URL-адрес в пакет, используя System.Web.Optimization:

public static System.Web.IHtmlString GetScriptBundleHTML(string virtualTargetPath)
 {
 return System.Web.Optimization.Scripts.Render(virtualTargetPath);
 }

В моих .aspx файлах я делаю это:

<%@ Register TagPrefix="cc1" Namespace="AdHocBundler" Assembly="AdHocBundler" %>

...

<cc1:scriptbundle name="MyBundle" runat="Server">
 <cc1:script src="~/js/script1.js">
 </cc1:script></cc1:scriptbundle>

Трюк для меня заключался в том, что мне пришлось конвертировать теги script и link, чтобы работать как элементы списка в элементах ScriptBundle и StyleBundle, но после этого он отлично работает И это позволяет мне используйте оператор тильды для упрощения ссылок относительно корня приложения (используя Page.ResolveClientUrl(), что полезно для создания содержимого модуля).

Спасибо за этот ответ "SO" за то, что помогли мне разобраться, как создать пользовательский элемент управления коллекцией: Как вы создаете пользовательский элемент управления ASP.NET с свойством коллекции?

ОБНОВЛЕНИЕ: В интересах полного раскрытия я получил разрешение на совместное использование кода для ScriptBundle (StyleBundle почти идентичен, поэтому его не включили):

[DefaultProperty("Name")]
[ParseChildren(true, DefaultProperty = "Scripts")]
public class ScriptBundle : Control
{
 public ScriptBundle()
 {
 this.Enabled = true;
 this.Scripts = new List";
 public Script()
 {
 this.Type = ATTR_TYPE_DEFAULT;
 this.Src = null;
 }
 public String Type { get; set; }
 public String Src { get; set; }
 public String Language { get; set; }
}


Это невозможно при использовании Bundling/Minification по умолчанию в ASP.NET. Весь смысл связывания состоит в том, чтобы создать единый файл для уменьшения количества запросов браузера для загрузки статических файлов, таких как файлы .JS и .CSS.

Роллинг - ваш единственный вариант. Однако обратите внимание, что каждая строка


Ваша проблема в том, что вы на самом деле не думаете об этой проблеме. Если бы вы были, вы бы поняли, что то, о чем вы просите, не может работать.

Почему? Потому что тег script ahs генерирует ссылку на внешнюю ссылку на другой URL-адрес. Таким образом, все, что вы помещаете в заголовок текущего файла, не повлияет на ваш другой URL-адрес, который фактически содержит ваши пакеты. Таким образом, нет возможности динамически изменять ваши пакеты в самой странице, потому что пакеты по определению должны быть определены во внешнем ресурсе.

Теперь нет ничего, что говорит о том, что эти пакеты должны быть скомпилированы в DLL в вашем собственном решении, но они не могут быть встроены в страницу, которая в настоящее время отображается.

Возможно, вам захочется изучить некоторые из инструментов мини-обработки, основанных на javascript, поскольку они обычно не компилируются.

licensed under cc by-sa 3.0 with attribution.