网站建设南昌,nanopi neo做网站,家居网站建设策划开发,企业主页是什么Demo路径#xff1a;https://github.com/yanshengjie/RPL.Demo1. IntroductionRazor Page Library 是ASP.NET Core 2.1引入的新类库项目#xff0c;属于新特性之一#xff0c;用于创建通用页面公用类库。也就意味着可以将多个Web项目中通用的Web页面提取出来#xff0c;封装… Demo路径https://github.com/yanshengjie/RPL.Demo1. IntroductionRazor Page Library 是ASP.NET Core 2.1引入的新类库项目属于新特性之一用于创建通用页面公用类库。也就意味着可以将多个Web项目中通用的Web页面提取出来封装成RPL以进行代码重用。官方文档Create reusable UI using the Razor Class Library project in ASP.NET Core中仅简单介绍了如何创建RPL但要想开发出一个独立通用的RPL远远没有那么简单容我娓娓道来。2. Hello RPL老规矩从Hello World 开始我们创建一个Demo项目。记住开始之前请确认已安装.NET Core 2.1 SDK我们这次使用命令行来创建项目dotnet --version2.1.300dotnet 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 内完成。还原成功。
dotnet new mvc --name RPL.Web
已成功创建模板“ASP.NET Core Web App (Model-View-Controller)”。
此模板包含非 Microsoft 的各方的技术有关详细信息请参阅 https://aka.ms/aspnetc
ore-template-3pn-210。正在处理创建后操作...正在 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 内完成。还原成功。
dotnet new sln --name RPL.Demo
已成功创建模板“Solution File”。
dotnet sln RPL.Demo.sln add RPL.CommonUI/RPL.CommonUI.csproj
已将项目“RPL.CommonUI\RPL.CommonUI.csproj”添加到解决方案中。
dotnet sln RPL.Demo.sln add RPL.Web/RPL.Web.csproj
已将项目“RPL.Web\RPL.Web.csproj”添加到解决方案中。创建完毕后双击RPL.Demo.sln打开解决方案如下图修改Page1.cshtmlbody内添加h1This is from CommonUI.Page1/h1RPL.Web添加引用项目【RPL.CommonUI】设置RPL为启动项目。CTRLF5运行。我们观察到RPL.CommonUI中预置了一个Razor Page因为Razor Page是基于文件系统路由所以直接https://localhost:port/myfeature/page1即可访问。到这一步我们就可以笃定RPL正确生效。3. Keep Going以上只是简单的HTML页面如果要想加以润色就需要写CSS来处理。两种处理方式使用内联样式引用外部样式文件内联样式很简单就不加以赘述。我们来定义样式文件来处理。仿照RPL.Web项目创建一个wwwroot根目录然后再添加一个css文件夹再添加一个demo.css的样式文件。h1 {    color: red;
}然后将demo.css引用添加到page1.cshtml中。headmeta nameviewport contentwidthdevice-width /link relstylesheet href~/css/demo.css /titlePage1/title/headCTRLF5重新运行运行结果如下图可以清晰的看到定义的样式并未生效。从浏览器F12 Developer Tool中可以清晰的看到无法请求demo.css样式文件。到这里也就抛出了本文所要解决的问题如何开发独立通用的RPL?如果RPL中无法引用项目中定义一些静态资源文件CSS、JS、Image等那RPL将无法有效的组织View。4. Analyze要想访问RPL中的静态资源文件首先我们要弄明白.NET Core Web项目中wwwroot文件夹的资源是如何访问的。这一切得从应用程序启动说起为了方便查阅使用Code Map将相关代码显示如下从中可以看出在构建WebHost的业务逻辑中会去初始化IHostingEnvironment对象。该对象主要用来描述应用程序运行的web宿主环境的相关信息主要包含以下几个属性string EnvironmentName { get; set; }string ApplicationName { get; set; }string WebRootPath { get; set; }
IFileProvider WebRootFileProvider { get; set; }string ContentRootPath { get; set; }
IFileProvider ContentRootFileProvider { get; set; }从上图的注释代码中可以看到其初始化逻辑正是去指定WebRootPath和WebRootFileProvider。如果我们在应用程序未手动通过webHostBuilder.UseWebRoot(your web root path);指定自定义的Web Root路径那么将会默认指定为wwwroot文件夹。同时注意下面这段代码hostingEnvironment.WebRootFileProvider  newPhysicalFileProvider(hostingEnvironment.WebRootPath);其指定的IFileProvider的类型为PhysicalFileProvider。到这里是不是就豁然开朗了Web 应用启动时指定的WebRootFileProvider仅仅映射了Web应用的wwwroot目录自然是访问不了我们RPL项目指定的wwwroot目录啊。到这里其实我们离问题就很近了。但是只要指定了WebRootFileProvider就可以访问WebRoot目录的资源了吗并不是。我们知道ASP.NET Core是通过由一系列中间件组装而成的请求管道来处理请求的。不管是View视图也好还是静态资源文件也好都是通过Http Request来请求的。HTTP Request流入请求管道后根据请求类型不同的中间件负责处理不同的请求。那对于静态资源文件ASP.NET Core中是借助StaticFileMiddleware中间件来处理的。这也就是为什么在启动类Startup的Configure方法中需要指定app.UseStaticFiles();来启用StaticFileMiddleware中间件。在ASP.NET Core 官方文档中Static files in ASP.NET Core介绍了如何访问自定义目录的静态资源文件。如果需要访问自定义路径目录的资源需要添加类似以下代码app.UseStaticFiles(new StaticFileOptions{FileProvider  new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), MyStaticFiles)),RequestPath  /StaticFiles});但这似乎并不能满足我们的需求。Why看标题开发独立通用的RPL。怎么理解独立通用也就意味着RPL中的资源文件最好能够通过程序集打包。这样才能完全独立。否则在发布RPL时还需要输出静态资源文件显然增加了使用的难度。而如何将资源文件打包进程序集呢——内嵌资源。5. Embedded Resource一个程序集主要由两种类型的文件构成它们分别是承载IL代码的托管模块文件和编译时内嵌的资源文件。那在.NET Core中如何定义内嵌资源呢编辑RPL.CommonUI.csproj文件添加wwwroot为内嵌资源。  ItemGroupEmbeddedResource Includewwwroot\**\* //ItemGroup添加GenerateEmbeddedFilesManifest节点指定生成内嵌资源清单。GenerateEmbeddedFilesManifesttrue/GenerateEmbeddedFilesManifest添加Microsoft.Extensions.FileProviders.EmbeddedNuget包引用。修改完后的RPL.CommonUI.csproj如下所示Project SdkMicrosoft.NET.Sdk.RazorPropertyGroupTargetFrameworknetstandard2.0/TargetFrameworkGenerateEmbeddedFilesManifesttrue/GenerateEmbeddedFilesManifest/PropertyGroupItemGroupPackageReference IncludeMicrosoft.AspNetCore.Mvc Version2.1.0 /PackageReference IncludeMicrosoft.Extensions.FileProviders.Embedded Version2.1.0 //ItemGroupItemGroupEmbeddedResource Includewwwroot\**\* //ItemGroup/Project我们用ildasm.exe反编译RPL.CommonUI.dll查看下其程序集清单从图中可以看出内嵌的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)
});CTRLF5运行。Perfect当然这也不是最好的解决方案因为你肯定不想所有调用这个RPL的地方添加这么几句代码因为这段代码有很强的侵入性且不可隔离变化。5. Final Solution编辑RPL.CommonUI.csproj文件添加wwwroot为内嵌资源。  ItemGroupEmbeddedResource Includewwwroot\**\* //ItemGroup添加GenerateEmbeddedFilesManifest节点指定生成内嵌资源清单。GenerateEmbeddedFilesManifesttrue/GenerateEmbeddedFilesManifest添加Microsoft.AspNetCore.StaticFiles和Microsoft.Extensions.FileProviders.EmbeddedNuget包引用。修改完后的RPL.CommonUI.csproj如下所示Project SdkMicrosoft.NET.Sdk.RazorPropertyGroupTargetFrameworknetstandard2.0/TargetFrameworkGenerateEmbeddedFilesManifesttrue/GenerateEmbeddedFilesManifest/PropertyGroupItemGroupPackageReference IncludeMicrosoft.AspNetCore.Mvc Version2.1.0 /PackageReference IncludeMicrosoft.AspNetCore.StaticFiles Version2.1.0 /PackageReference IncludeMicrosoft.Extensions.FileProviders.Embedded Version2.1.0 //ItemGroupItemGroupEmbeddedResource Includewwwroot\**\* //ItemGroup/Project接下来添加CommonUIConfigureOptions.cs定义如下然后添加CommonUIServiceCollectionExtensions.cs代码如下修改RPL.Web启动类startup.cs在services.AddMvc()之前添加services.AddCommonUI();即可。CTRLF5重新运行我们发现H1被成功设置为红色检查发现demo.css也能正确被请求检查network也可以看到其Request URL为https://localhost:44379/css/demo.cssStatic files in ASP.NET CoreFile Providers in ASP.NET CoreManifestEmbeddedFileProvider ClassMake it easier to use static assets that are part of a RCL project.NET Core的文件系统[4]由EmbeddedFileProvider构建的内嵌资源文件系统相关文章 用ASP.NET Core 2.1 建立规范的 REST API -- HATEOAS在ASP.NET Core中使用brotli压缩ASP.NET Core2.1 你不得不了解的GDPR.NET Core 2.1改进了性能并提供了新的部署选项Entity Framework Core 2.1带来更好的SQL语句生成方案原文地址: https://www.cnblogs.com/sheng-jie/p/9165547.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com