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 |