Можно ли использовать поставщика виртуального пути с 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
:
- Добавить файл с именем
image.png
в новую папку\content\images\
- Задавать
Build Action
вEmbedded Resource
для этого изображения - добавлять
[assembly: System.Web.UI.WebResource("MyFramework.content.images.image.png", "image/png")]
вAssemblyInfo.cs
- добавлять
protected string myImageUrl { get; private set; }
так что мы можем получить доступ к URL-адресу в классе наследования - добавлять
myImageUrl = Page.ClientScript.GetWebResourceUrl(typeof(MyModuleBase), "MyFramework.content.images.image.png");
на вашOnInit()
метод
В потребляющем проекте MyModule
:
- добавлять
<img src="<%=myImageUrl%>"/>
вView.ascx
Для HTML и аналогичного типа контента вы можете сделать то же самое, что вы уже сделали для скриптов:
В библиотеке MyFramework
:
- Добавить файл с именем
myhtml.html
в новую папку\content\html\
(в моем файле у меня есть:<div style="font-weight: bold;font-size: x-large">Some <span style="color: orange">HTML</span></div>
) - Задавать
Build Action
вEmbedded Resource
для HTML - добавлять
[assembly: System.Web.UI.WebResource("MyFramework.content.html.myhtml.html", "text/html")]
вAssemblyInfo.cs
- добавлять
protected string MyHtmlUrl { get; private set; }
так что мы можем получить доступ к HTML в классе наследования - Добавлять:
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
:
- добавлять
<%=MyHtmlUrl%>
вView.ascx