Ответ 1
AddDirectory был переименован в IncludeDirectory, поэтому вы все равно можете попробовать это.
У меня есть asp.net mvc4. У меня есть модули, которые развертываются в качестве подкаталогов в этом приложении с использованием виртуальных каталогов IIS, и мне нужно ссылаться на файлы в этих модулях. Эти DLL-модули регистрируют пакеты. Но пакеты не генерируют ничего на html-страницу.
Из этого сообщения is-it-possible-to-unit-test-bundleconfig-in-mvc4 я вижу, что внутри пакетов используются Server.MapPath. Поэтому кажется, что он должен работать.
Я подключил BundleTable.MapPathMethod и даже сам вызвал Server.MapPath, который правильно разрешает правильный физический каталог. Но он все равно ничего не сделает на странице html.
Затем был этот пост why-does-resolvebundleurl-not-work-for-custom-folders, в котором упоминалась функция "AddDirectory" для пользовательских папок, но эта функция больше не доступна в последней библиотеке оптимизации.
Я также попытался использовать новый метод "IncludeDirectory", но это не сработало.
ScriptBundle scriptBundle = new ScriptBundle("~/bundles/jquery");
scriptBundle.IncludeDirectory(basePath + "/Scripts/","jquery-1.*");
bundles.Add(scriptBundle);
Что-нибудь еще я могу попытаться сделать этой работой?
8/27/12
ПРОБЛЕМА ОТВЕТИМА: В принципе System.Web.Optimization не работает с веб-адресами, которые являются подчиненными виртуальными каталогами IIS.
Проблема заключается в этих строках кода внутри BundleResolver.GetBundleContents
string mapPathMethod = this.MapPathMethod("~/");
if (!file.FullName.StartsWith(mapPathMethod, StringComparison.OrdinalIgnoreCase))
который в основном предполагает, что каждый связанный файл будет находиться в папке PHYSICAL под папкой PHYSICAL основного веб-приложения.
Проблема, IMO, заключается в том, что поисковый путь относительного URL-адреса веб-поиска, который требуется найти, преобразуется в физический путь очень рано, и все ссылки на то, что относительный URL-адрес, используемый для получения этих физических файлов, выбрасывается.
Итак, чтобы посмотреть, смогу ли я сделать эту работу, мне пришлось декомпилировать System.Web.Optimization на чистый код, а затем снова перекомпилировать, чтобы я мог "исправить" его. Первым шагом было добавить свойство RelativePath в BundleItem, дополнительный конструктор BundleItem, чтобы передать исходный относительный URL-адрес, чтобы сохранить папку каталога относительного поиска. Затем я заменил код выше циклом, прежде чем он попытается пересортировать файлы, найденные с помощью BundleItem, чтобы их можно было преобразовать обратно в допустимый URL-адрес веб-страницы
foreach (BundleItem bundleItem in bundleFor.Items)
{
if (file.FullName.StartsWith(bundleItem.Path, StringComparison.OrdinalIgnoreCase)){
string str = file.FullName.Replace(bundleItem.Path,bundleItem.RelativePath);
str = str.Replace('\\', '/');
strs.Add(str);
break;
}
}
Теперь мои пакеты правильно отображаются. ЗАМЕЧАНИЕ, однако, что я еще не проверил это исправление хака для выпуска или с оптимизацией или минимизацией.
Я действительно думаю, что команда asp.net должна сделать System.Web.Optimizations поддержку файлов в виртуальных каталогах IIS. Особенно сейчас, когда VS2012 поддерживает IIS Express, что, в конечном итоге, упростит сборку модульных веб-приложений с файлами, на которые ссылаются виртуальные каталоги IIS.
AddDirectory был переименован в IncludeDirectory, поэтому вы все равно можете попробовать это.
Вы должны выполнить это с помощью virtualPathProvider, если вы его правильно настроите.
См. мой ответ здесь для получения информации о том, как зарегистрировать его: BundleTable.Bundles.GetBundleFor() возвращает, но не элементы внутри