RazorSlices 0.8.1

dotnet add package RazorSlices --version 0.8.1                
NuGet\Install-Package RazorSlices -Version 0.8.1                
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="RazorSlices" Version="0.8.1" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中以引用此包。
paket add RazorSlices --version 0.8.1                
#r "nuget: RazorSlices, 0.8.1"                
#r 指令可以用于 F# Interactive 和 Polyglot Notebooks。将其复制到交互工具或脚本的源代码中,以引用包。
// 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

CI (main) Nuget

轻量级 基于 Razor 的模板,用于 ASP.NET Core(无需 MVC、Razor Pages 或 Blazor),针对高性能、无缓冲的渲染和低分配进行了优化。兼容 trim 和本地 AOT。非常适合从 Minimal APIs、中间件等返回动态渲染的 HTML。支持 .NET 8+

入门指南

  1. 将 NuGet 包安装到您的 ASP.NET Core 项目中 (.NET 8+)

    > dotnet add package RazorSlices
    
  2. 在您的项目中创建一个名为 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
    
  3. 在同一目录中,添加一个 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 的泛型参数来渲染切片。

  4. 将一个最小 API 添加到您的 Program.cs 中以返回切片

    app.MapGet("/hello", () => Results.Extensions.RazorSlice<MyApp.Slices.Hello, DateTime>(DateTime.Now));
    

安装

NuGet 发布版本

Nuget

此包当前可从 nuget.org 获取

> dotnet add package RazorSlices

CI 构建

如果您希望使用此存储库的 main 分支的构建,可以从 此存储库的包源 安装它们。

  1. 为您的 GitHub 账户创建一个具有 read:packages 范围的个人访问令牌,并设置您希望的有效期限长度

    <img width="583" alt="image" src="https://user-images.githubusercontent.com/249088/160220117-7e79822e-a18a-445c-89ff-b3d9ca84892f.png">

  2. 在命令行中,导航到您的用户配置文件目录,并运行以下命令将包源添加到您的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
    
  3. 现在您应该能够添加一个指定版本的包引用,地址为存储库包源

  4. 请参阅这些说明以获取有关使用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>())从切片渲染切片(称为部分)

  • 将切片作为其他切片的布局使用,包括具有强类型模型的布局

    • 对于布局切片,从RazorLayoutSliceRazorLayoutSlice<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[]值写入输出

  • 直接渲染到PipeWriterStreamTextWriterStringBuilder输出,包括对不装箱结构值,对原始数字等的基本类型的零分配渲染的优化等。(而不是在一切上调用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 已计算。
兼容的目标框架
包括的目标框架(在包中)
了解更多关于 目标框架.NET Standard 的信息。
  • 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