Можно ли использовать провайдера виртуального пути с DotNetNuke?

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

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

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

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

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

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


person Beatles1692    schedule 23.02.2017    source источник


Ответы (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">
person VDWWD    schedule 04.03.2017
comment
Модуль должен быть автономным пакетом, который можно развернуть на любой установке DNN, это правда, и я не собираюсь поступать иначе. Напротив, я хочу иметь возможность сохранять связанные файлы каждой dll в качестве встроенных ресурсов, чтобы я мог очень легко повторно использовать их с другими модулями. - person Beatles1692; 04.03.2017

С помощью 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

person K Scandrett    schedule 10.03.2017
comment
проблема в том, что angular загружает html-файлы, например, используя параметр шаблона в маршруте, используя его URL-адрес. Как мы можем загружать html-файлы, используя веб-ресурсы таким образом? - person Beatles1692; 10.03.2017
comment
Я мало играл с маршрутами Angular, но я ожидаю, что вы можете использовать опцию изображения выше, чтобы получить URL-адрес html, если вы хотите использовать templateUrl. В противном случае вы можете передать сам шаблон html в свойство template, а не использовать templateUrl - person K Scandrett; 10.03.2017
comment
Я только что проверил первое предложение MyHtmlUrl = Page.ClientScript.GetWebResourceUrl(typeof(MyModuleBase), "MyFramework.content.html.myhtml.html". Теперь я могу просмотреть этот html через http:/hostsite/WebResource.axd?d=MVB7...., поэтому передайте его в templateUrl. - person K Scandrett; 10.03.2017