RazorSlices 0.8.1
dotnet add package RazorSlices --version 0.8.1
NuGet\Install-Package RazorSlices -Version 0.8.1
<PackageReference Include="RazorSlices" Version="0.8.1" />
paket add RazorSlices --version 0.8.1
#r "nuget: RazorSlices, 0.8.1"
// Install RazorSlices as a Cake Addin #addin nuget:?package=RazorSlices&version=0.8.1 // Install RazorSlices as a Cake Tool #tool nuget:?package=RazorSlices&version=0.8.1
Razor Slices
轻量级 基于 Razor 的模板,用于 ASP.NET Core(无需 MVC、Razor Pages 或 Blazor),针对高性能、无缓冲的渲染和低分配进行了优化。兼容 trim 和本地 AOT。非常适合从 Minimal APIs、中间件等返回动态渲染的 HTML。支持 .NET 8+
入门指南
- 将 NuGet 包安装到您的 ASP.NET Core 项目中 (.NET 8+) - > dotnet add package RazorSlices
- 在您的项目中创建一个名为 Slices 的目录,并向其中添加一个 _ViewImports.cshtml 文件,内容如下 - @inherits RazorSliceHttpResult @using System.Globalization; @using Microsoft.AspNetCore.Razor; @using Microsoft.AspNetCore.Http.HttpResults; @tagHelperPrefix __disable_tagHelpers__: @removeTagHelper *, Microsoft.AspNetCore.Mvc.Razor
- 在同一目录中,添加一个 Hello.cshtml 文件,内容如下 - @inherits RazorSliceHttpResult<DateTime> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Hello from Razor Slices!</title> </head> <body> <p> Hello from Razor Slices! The time is @Model </p> </body> </html>- 每个 .cshtml 文件都由 Razor Slices 源生成器为它生成一个代理类型,您可以使用它作为 Razor Slices 中不同 API 的泛型参数来渲染切片。 
- 将一个最小 API 添加到您的 Program.cs 中以返回切片 - app.MapGet("/hello", () => Results.Extensions.RazorSlice<MyApp.Slices.Hello, DateTime>(DateTime.Now));
安装
NuGet 发布版本
此包当前可从 nuget.org 获取
> dotnet add package RazorSlices
CI 构建
如果您希望使用此存储库的 main 分支的构建,可以从 此存储库的包源 安装它们。
- 为您的 GitHub 账户创建一个具有 - read:packages范围的个人访问令牌,并设置您希望的有效期限长度
- 在命令行中,导航到您的用户配置文件目录,并运行以下命令将包源添加到您的NuGet配置中,用相关值替换 - <GITHUB_USER_NAME>和- <PERSONAL_ACCESS_TOKEN>占位符- ~> dotnet nuget add source -n GitHub -u <GITHUB_USER_NAME> -p <PERSONAL_ACCESS_TOKEN> https://nuget.pkg.github.com/DamianEdwards/index.json
- 现在您应该能够添加一个指定版本的包引用,地址为存储库包源 
- 请参阅这些说明以获取有关使用GitHub包源的其他详细信息。 
功能
该库仍然是新的,功能正在积极添加。
目前支持
- ASP.NET Core 8.0及以上 
- 强类型模型(通过 - @inherits RazorSlice<MyModel>或- @inherits RazorSliceHttpResult<MyModel>)
- Razor结构 - 隐式表达式,例如 - @someVariable
- 显式表达式,例如 - @(someBool ? thisThing : thatThing)
- 控制结构,例如 - @if(),- @switch()等。
- 循环,例如 - @for,- @foreach,- @while,- @do
- 代码块,例如 - @{ var someThing = someOtherThing; }
- 函数,例如 - @functions { private readonly string _someString = "A very important string"; private int DoAThing() => 123; }
- 模板化Razor委托,例如 - @inherits RazorSlice<Todo> <h1>@Title(Model)</h1> @functions { private IHtmlContent Title(Todo todo) { <text>Todo @todo.Id: @todo.Title</text> return HtmlString.Empty; } }
 
- 通过 - @inject激活的属性
- 通过 - @(await RenderPartialAsync<MyPartial>())从切片渲染切片(称为部分)
- 将切片作为其他切片的布局使用,包括具有强类型模型的布局 - 对于布局切片,从 - RazorLayoutSlice或- RazorLayoutSlice<TModel>继承,并在布局中使用- @await RenderBodyAsync()来渲染正文- @inherits RazorLayoutSlice<LayoutModel> <!DOCTYPE html> <html lang="en"> <head> <title>@Model.Title</title> @await RenderSectionAsync("head") </head> <body> @await RenderBodyAsync() <footer> @await RenderSectionAsync("footer") </footer> </body> </html>
- 对于使用布局的切片,实现 - IUsesLayout<TLayout>或- IUsesLayout<TLayout, TModel>以声明要使用的布局。如果使用具有模型的布局,请确保在您的- @functions块中实现- LayoutModel属性,例如- @inherits RazorSlice<SomeModel> @implements IUsesLayout<LayoutSlice, LayoutModel> <div> @* Content here *@ </div> @functions { public LayoutModel LayoutModel => new() { Title = "My Layout" }; }
- 布局可以通过 - @await RenderSectionAsync("SectionName")渲染部分,切片可以通过覆盖- ExecuteSectionAsync将内容渲染到部分,例如- protected override Task ExecuteSectionAsync(string name) { if (name == "lorem-header") { <p class="text-info">This page renders a custom <code>IHtmlContent</code> type that contains lorem ipsum content.</p> } return Task.CompletedTask; }- 注意:不支持 - @section指令,因为它与Razor Slices的渲染方式不兼容
 
- 异步渲染,即模板可以包含 - await语句,例如- @await WriteTheThing()
- 直接将UTF8 - byte[]值写入输出
- 直接渲染到 - PipeWriter,- Stream,- TextWriter,- StringBuilder和- 输出,包括对不装箱结构值,对原始数字等的基本类型的零分配渲染的优化等。(而不是在一切上调用 - ToString())
- 在最小API中,直接作为 - IResult返回切片实例,使用- @inherits RazorSliceHttpResult以及- Results.Extensions.RazorSlice("/Slices/Hello.cshtml")
- 与ASP.NET Core最小API结合使用时,完全支持修剪和原生的AOT 
有兴趣支持但还没有确定
- 帮助支持HTMX与Razor Slices的扩展
- 对Razor编译器本身进行小更新,以获得一些用户新的功能和性能改进,例如- 不要将模板的ExecuteAsync方法标记为异步方法,除非模板包含异步语句,以节省异步状态机的开销
- 支持将静态模板元素编译为UTF8字符串字面量(ReadOnlySpan<byte>),而不是字符串字面量,以节省渲染过程中的UTF16到UTF8转换
- 支持禁用默认注册的依赖 MVC 的 @addtaghelper和@model指令
 
- 不要将模板的
无意支持以下内容:
- 标签助手和视图组件(它们与 MVC 相关,并且本质上是“重”)
- @model指令(Razor 编译器不支持与通过- @inherits指定的自定义基类型一起使用)
- @attribute [Authorize](对于最小 API 等来说,抽象层次不正确)
- @section指令(Razor 编译器生成的代码与 Razor Slices 的渲染方式不兼容)
| 产品 | 版本 兼容和额外的计算目标框架版本。 | 
|---|---|
| .NET | net8.0 是兼容的。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 | 
- 
                                                    net8.0- 无依赖。
 
NuGet 包 (1)
显示对 RazorSlices 依赖的前 1 个 NuGet 包
| 包 | 下载 | 
|---|---|
| Toolshed.Mailman 一个库,用于使用 MailKit 和 Razor 视图在 ASP.NET Core 中发送邮件。 | 
GitHub 仓库 (1)
显示对 RazorSlices 依赖的前 1 个流行的 GitHub 仓库
| 仓库 | 星级 | 
|---|---|
| aspnet/Benchmarks 
                                                            ASP.NET Core 的基准测试
                                                         | 
| 版本 | 下载 | 最后更新 | 
|---|---|---|
| 0.8.1 | 6,724 | 6/7/2024 | 
| 0.8.0 | 85 | 6/7/2024 | 
| 0.7.0 | 13,745 | 6/3/2023 | 
| 0.6.2 | 145 | 5/31/2023 | 
| 0.6.1 | 141 | 5/30/2023 | 
| 0.6.0 | 121 | 5/30/2023 | 
| 0.5.0 | 208 | 4/5/2023 | 
| 0.4.0 | 236 | 3/24/2023 | 
| 0.3.0 | 2,725 | 3/13/2023 | 
| 0.2.0 | 215 | 3/10/2023 | 
| 0.1.2 | 231 | 3/8/2023 | 
| 0.1.1 | 223 | 3/8/2023 | 
| 0.1.0 | 224 | 3/8/2023 | 
| 0.1.0-pre.20230307.10 | 105 | 3/7/2023 |