Можно ли использовать поставщика виртуального пути с DotNetNuke?

У нас есть модуль DNN, который использует Angular в качестве своей клиентской инфраструктуры. Я хотел бы иметь возможность встраивать все ресурсы, такие как html, js,css,images и шрифты, в мой модуль (на самом деле наш модуль имеет более одной dll, и каждый из них имеет свои собственные ресурсы, так что я не не хочу копировать все эти ресурсы в основную папку модуля каждый раз, когда я хочу сделать пакет)

До сих пор я пробовал WebResource.axd, который в некоторой степени был успешным ( вот что я сделал), но потом я понял, что как-то невозможно встраивать html, изображения и другие материалы, а не js и css (или это не так) т?)

Затем я решил попробовать использовать VirtualPathProvider, и я использовал этот проект с открытым исходным кодом, который реализует EmbeddedResourcesVirtualProvider.

Я зарегистрировал этого провайдера, используя интерфейс IRouteMapper DNN. Теперь, когда я начинаю тестировать свой проект, я получаю 404 за все мои ресурсы. Я попытался отладить проект и поставить некоторые точки останова на методы FileExists,DirectoryExists и GetFile VirtualProvider, но единственный виртуальный путь, который запрашивается у VirtaulProvider, это "~/Default.aspx" и ничего больше.

Я хотел бы спросить, можно ли использовать VirtualParhProvider с DNN?

Мы используем DNN 8.

2 ответа

Я думаю, ты немного усложнил ситуацию. Если вам нужен виртуальный поставщик для работы вашего модуля, вы делаете это неправильно (на мой взгляд). Модуль должен быть автономным пакетом, который может быть развернут в любой установке DNN без каких-либо действий, кроме установки модуля.

Обычно, когда вы покупаете или скачиваете бесплатный модуль, он поставляется в виде одного zip-файла со всеми необходимыми файлами, содержащимися в этом zip-файле. Это может быть файл любого типа (.dll, .js, css, .ascx, .aspx и т. Д.), Не имеет значения, если он определен в .dnn установочный файл.

Затем вы можете ссылаться на файлы в ascx вашего модуля.

<script type="text/javascript" src="/DesktopModules/YourModulePath/js/file.js"></script>
or
<img src="/DesktopModules/YourModulePath/images/image.jpg">

С WebResource вы можете встраивать что угодно - изображения, html, шрифты и т. Д., Поэтому я бы предложил продолжить с подходом, который вы уже использовали.

Я скачал и установил ваш модуль в DDN 8 для тестирования. Таким образом, следующее предполагает, что установка.


Чтобы встроить изображение, вы можете сделать это:

В библиотеке MyFramework:

  1. Добавить файл с именем image.png в новую папку \content\images\
  2. Задавать Build Action в Embedded Resource для этого изображения
  3. добавлять [assembly: System.Web.UI.WebResource("MyFramework.content.images.image.png", "image/png")] в AssemblyInfo.cs
  4. добавлять protected string myImageUrl { get; private set; } так что мы можем получить доступ к URL-адресу в классе наследования
  5. добавлять myImageUrl = Page.ClientScript.GetWebResourceUrl(typeof(MyModuleBase), "MyFramework.content.images.image.png"); на ваш OnInit() метод

В потребляющем проекте MyModule:

  1. добавлять <img src="<%=myImageUrl%>"/> в View.ascx


Для HTML и аналогичного типа контента вы можете сделать то же самое, что вы уже сделали для скриптов:

В библиотеке MyFramework:

  1. Добавить файл с именем myhtml.html в новую папку \content\html\ (в моем файле у меня есть: <div style="font-weight: bold;font-size: x-large">Some <span style="color: orange">HTML</span></div>)
  2. Задавать Build Action в Embedded Resource для HTML
  3. добавлять [assembly: System.Web.UI.WebResource("MyFramework.content.html.myhtml.html", "text/html")] в AssemblyInfo.cs
  4. добавлять protected string MyHtmlUrl { get; private set; } так что мы можем получить доступ к HTML в классе наследования
  5. Добавлять:
var assembly = Assembly.GetExecutingAssembly();
var resourceName = "MyFramework.content.html.myhtml.html";

using (Stream stream = assembly.GetManifestResourceStream(resourceName))
{
   using (StreamReader reader = new StreamReader(stream))
   {
       MyHtmlUrl = reader.ReadToEnd();
   }
}

В потребляющем проекте MyModule:

  1. добавлять <%=MyHtmlUrl%> в View.ascx

Другие вопросы по тегам