大佬教程收集整理的这篇文章主要介绍了Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Razor Page Library 是ASP.NET Core 2.1引入的新类库项目,属于新特性之一,用于创建通用页面公用类库。也就意味着可以将多个Web项目中通用的Web页面提取出来,封装成RPL,以进行代码重用。 官方文档中,仅简单介绍了如何创建RPL,但要想开发出一个独立通用的RPL远远没有那么简单,容我娓娓道来。
老规矩,从Hello World 开始,我们创建一个Demo项目。 记住开始之前请确认已安装!!! 我们这次使用命令行来创建项目:
>dotnet --version
2.1.300
>dotnet new razorclasslib --name RPl.CommonUI
已成功创建模板“Razor Class Library”。
正在处理创建后操作...
正在 RPl.CommonUI\RPl.CommonUI.csproj 上运行 "dotnet restore"...
正在还原 F:\Coding\Demo\RPl.CommonUI\RPl.CommonUI.csproj 的包...
正在生成 MSBuild 文件 F:\Coding\Demo\RPl.CommonUI\obj\RPl.CommonUI.csproj.nuge
t.g.props。
正在生成 MSBuild 文件 F:\Coding\Demo\RPl.CommonUI\obj\RPl.CommonUI.csproj.nuge
t.g.targets。
F:\Coding\Demo\RPl.CommonUI\RPl.CommonUI.csproj 的还原在 1.34 sec 内完成。
还原成功。
正在处理创建后操作...
正在 RPl.Web\RPl.Web.csproj 上运行 "dotnet restore"...
正在还原 F:\Coding\Demo\RPl.Web\RPl.Web.csproj 的包...
正在生成 MSBuild 文件 F:\Coding\Demo\RPl.Web\obj\RPl.Web.csproj.nuget.g.props
。
正在生成 MSBuild 文件 F:\Coding\Demo\RPl.Web\obj\RPl.Web.csproj.nuget.g.target
s。
F:\Coding\Demo\RPl.Web\RPl.Web.csproj 的还原在 2 sec 内完成。
还原成功。
netstandard2.0
true
我们用ildasm.exe反编译RPl.CommonUI.dll,查看下其程序集清单:
title="Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)" alt="Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)" src="https://cn.js-code.com/res/2019/02-08/23/b9c4e0f926532b72b51354a5f8745ff3.png" >
从图中可以看出内嵌的demo.css文件,是以{程序集名称}.{文件路径}命名的。
那内嵌资源如何访问呢?可以借助EmbeddedFileProvider
,我们仿照上面的例子,在Startup.cs
的Configure
方法中添加以下代码:
app.UseStaticFiles();
var dllPath = Path.Join(Path.GetDirectoryName(Assembly.GetEntryAssembly().LOCATIOn),"RPl.CommonUI.dll");
app.UseStaticFiles(new StaticFiLeoptions
{
FileProvider = new ManifestEmbeddedFileProvider(Assembly.LoadFrom(dllPath),"wwwroot")
});
CTRL+F5,运行。Perfect!
title="Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)" alt="Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)" src="https://cn.js-code.com/res/2019/02-08/23/c4fabf8af1f7625403422e73bd1626b0.png">
当然这也不是最好的解决方案,因为你肯定不想所有调用这个RPL的地方,添加这么几句代码,因为这段代码有很强的侵入性,且不可隔离变化。
GenerateEmbeddedFilesmanifest
节点,指定生成内嵌资源清单。true
修改完后的RPl.CommonUI.csproj,如下所示:
ject Sdk="Microsoft.NET.Sdk.Razor">
netstandard2.0
true
CommonUIConfigureOptions.cs
,定义如下:using Microsoft.AspNetCore.builder;
using Microsoft.AspNetCore.HosTing;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Options;
using System;
namespace RPl.CommonUI
{
internal class CommonUIConfigureOptions: IPostConfigureOptions
{
public CommonUIConfigureOptions(IHosTingEnvironment environment)
{
Environment = environment;
}
public IHosTingEnvironment Environment { get; }
public void PostConfigure(String name,StaticFiLeoptions options)
{
name = name ?? throw new ArgumentNullException(nameof(Name));
options = options ?? throw new ArgumentNullException(nameof(options));
// Basic initialization in case the options weren't initialized by any other component
options.ContentTypeProvider = options.ContentTypeProvider ?? new FileExtensionContentTypeProvider();
if (options.FileProvider == null && Environment.WebRootFileProvider == null)
{
throw new InvalidoperationException("Missing FileProvider.");
}
options.FileProvider = options.FileProvider ?? Environment.WebRootFileProvider;
// Add our provider
var filesProvider = new ManifestEmbeddedFileProvider(GetType().Assembly,"wwwroot");
options.FileProvider = new CompositeFileProvider(options.FileProvider,filesProvider);
}
}
}
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Text;
namespace RPl.CommonUI
{
public static class CommonUIserviceCollectionExtensions
{
public static void AddCommonUI(this IserviceCollection services)
{
services.ConfigureOptions(typeof(CommonUIConfigureOptions));
}
}
}
修改RPl.Web启动类startup.cs,在services.AddMvc()
之前添加services.AddCommonUI();
即可。
CTRL+F5重新运行,我们发现H1被成功设置为红色,检查发现demo.css也能正确被请求,检查network也可以看到其request URL为:
这个链接是一个进阶demo,演示了如何使用RPL去创建可重用的邮件模板,感兴趣的不妨一看。
以上是大佬教程为你收集整理的Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)全部内容,希望文章能够帮你解决Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。