【asp.net core 系列】5 布局页和静态资源 (2)

简单讲,如果在布局页中设置了@RenderBody,那么在使用了这个布局页的视图里所有没被分部块包裹的代码都会渲染到布局页中声明了@RenderBody的地方。

修改_Layout1.cshtml:

<html> <head> <title>Render 测试</title> </head> <body> <h1>RenderBody 测试 -之前</h1> @RenderBody() <h1>RenderBody 测试 -之后</h1> </body> </html>

修改RenderTest/Index.cshtml:

@{ Layout = "_Layout1"; } RenderBody测试 <h1>我是视图的内容!</h1>

重启应用,刷新刚刚访问的页面:

image-20200603230213462

可以看出,RenderBody渲染的位置。

2. 静态资源引入

通常情况下,静态资源的引入与HTML引用js和css等资源是一致的,但是对于我们在编写系统时自己创建的脚本和样式表,asp.net core提供了不同的处理方式。那就是服务器端压缩功能。

asp.net core 3.0 的mvc 默认项目是不启动这个功能的,需要我们额外的开启支持。

2.1 开启支持

先引入 BuildBundleMinifier

cd MvcWeb # 切换目录到MvcWeb项目下 dotnet add package BuildBundleMinifier

创建 bundleconfig.json

[ { "outputFileName": "wwwroot/css/site.min.css", "inputFiles": [ "wwwroot/css/site.css" ] }, { "outputFileName": "wwwroot/js/site.min.js", "inputFiles": [ "wwwroot/js/site.js" ], "minify": { "enabled": true, "renameLocals": true }, "sourceMap": false } ]

每个节点允许设置项:

outputFileName 生成的捆绑压缩文件,通常路径携带wwwroot

inputFiles 数组,包含要压缩到此次输出文件的文件路径,会按照添加的顺序依次加入

minify 输出类型的缩小选项,可选。 默认是 enabled: true

sourceMap 表示是否为捆绑的文件生成源映射的标记

sourceMapRootPath 源映射文件的路径

2.2 使用

正常情况下在布局页中,把压缩后的文件路径引入即可。不过在开发中,通常按照以下方式引用:

<environment exclude="Development"> <link href="http://www.likecs.com/~/css/site.min.css" asp-append-version="true" /> </environment> <environment include="Development"> <link href="http://www.likecs.com/~/css/site.css" /> </environment>

注: asp-append-version 表示在引用路径追加一个版本号,这是针对html静态资源缓存的问题的一个解决方案,这一步是由程序决定的。

environment表示环境,现在大家知道这个写法就行,在接下来的篇幅会讲。

3. 静态资源目录

我们知道到目前为止,我们的静态资源都是在wwwroot目录下。那么我们是否可以修改或者添加别的目录作为静态资源目录呢?

在Startup.cs文件内的Configure方法下有这样一行代码:

app.UseStaticFiles();

这行代码的意思就是启用静态文件,程序自动从 wwwroot寻找资源。那么,我们就可以从这个方法入手,设置我们自己的静态资源:

public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder app, StaticFileOptions options);

我们找到了这个方法的另一个重载版本,里面有一个参数类:

public class StaticFileOptions : SharedOptionsBase { public StaticFileOptions(); public StaticFileOptions(SharedOptions sharedOptions); public IContentTypeProvider ContentTypeProvider { get; set; } public string DefaultContentType { get; set; } public HttpsCompressionMode HttpsCompression { get; set; } public Action<StaticFileResponseContext> OnPrepareResponse { get; set; } public bool ServeUnknownFileTypes { get; set; } }

并没有发现我们想要的,先别慌,它还有个父类。我们再去它的父类里看看:

public abstract class SharedOptionsBase { protected SharedOptionsBase(SharedOptions sharedOptions); public IFileProvider FileProvider { get; set; } public PathString RequestPath { get; set; } protected SharedOptions SharedOptions { get; } }

这下就比较明了了,需要我们提供一个文件提供器,那么我们来找一个合适的IFileProvider实现类吧:

public class PhysicalFileProvider : IFileProvider, IDisposable

这个类可以满足我们的要求,它位于命名空间:

namespace Microsoft.Extensions.FileProviders

那么,添加一组我们自己的配置吧:

using Microsoft.Extensions.FileProviders; public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 省略其他代码,仅添加以下代码 app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(),"OtherStatic")), }); }

在项目的根目录创建名为OtherStatic的文件夹,然后在里面创建个文件夹,例如: files,并在这个文件夹里随便添加一个文件。

然后启动应用访问:

:5006/files/<你添加的文件(包括后缀名)>

然后能在浏览器中看到这个文件被正确响应。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfxdd.html