3

我们有一个使用 Angular 作为其客户端框架的 DNN 模块。我希望能够将所有资源,例如 html 、 js 、css 、图像和字体嵌入到我的模块中。(实际上我们的模块有多个 dll 并且每个都有自己的资源,所以我没有每次我要打包时都不想将所有这些资源复制到主模块文件夹中)

到目前为止,我已经尝试过 WebResource.axd,它在某种程度上是成功的(就是我所做的),但后来我意识到嵌入 html、图像和其他东西而不是 js 和 css 是不可能的(或者它不是吨?)

然后我决定尝试使用 VirtualPathProvider,并使用了这个实现 EmbeddedResourcesVirtualProvider 的开源项目。

我已经使用 DNN 的 IRouteMapper 接口注册了这个提供程序。现在我开始测试我的项目,我的所有资源都得到了 404。我尝试调试项目并在 VirtualProvider 的 FileExists 、DirectoryExists 和 GetFile 方法上放置一些断点,但从 VirtaulProvider 询问的唯一虚拟路径是“~/Default.aspx”,仅此而已

我想问是否可以将 VirtualParhProvider 与 DNN 一起使用?

我们正在使用 DNN 8。

4

2 回答 2

0

我认为你把事情复杂化了一点。如果您需要一个虚拟提供程序来让您的模块工作,那么您做错了(在我看来)。一个模块应该是一个自包含的包,可以部署在任何 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">
于 2017-03-04T15:09:51.233 回答
0

使用 WebResource,您可以嵌入任何内容 - 图像、html、字体等,因此我建议您继续使用您已经采用的方法。

我在 DDN 8 中下载并安装了您的模块进行测试。因此,以下假设设置。


要嵌入图像,您可以这样做:

在图书馆MyFramework

  1. 将名为的文件添加image.png到新文件夹\content\images\
  2. 为此图像设置Build ActionEmbedded 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 ActionEmbedded Resourcehtml
  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

于 2017-03-10T01:53:50.083 回答