asp.Net   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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.csConfigure方法中添加以下代码:

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的地方,添加这么几句代码,因为这段代码有很强的侵入性,且不可隔离变化。

  1. 编辑RPl.CommonUI.csproj文件,添加wwwroot为内嵌资源。
  
    
  
  1. 添加GenerateEmbeddedFilesmanifest节点,指定生成内嵌资源清单。
true
  1. 添加@H_507_4@microsoft.AspNetCore.StaticFiles和@H_507_4@microsoft.Extensions.FileProviders.EmbeddedNuget包引用。

修改完后的RPl.CommonUI.csproj,如下所示:

ject Sdk="Microsoft.NET.Sdk.Razor">

    netstandard2.0
    true
  

    
    
    
  
  
    
  
  1. 接下来添加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);
    }
}

}

  1. 然后添加CommonUIserviceCollectionExtensions.cs,代码如下:
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));
}
}
}

  1. 修改RPl.Web启动类startup.cs,在services.AddMvc()之前添加services.AddCommonUI();即可。

  2. CTRL+F5重新运行,我们发现H1被成功设置为红色,检查发现demo.css也能正确被请求,检查network也可以看到其request URL为:Request URL

这个链接是一个进阶demo,演示了如何使用RPL去创建可重用的邮件模板,感兴趣的不妨一看。

大佬总结

以上是大佬教程为你收集整理的Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)全部内容,希望文章能够帮你解决Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。

标签: