ASP.NET Core Razor 网页模板中将 Markdown 转换为 HTML

文章目录

    习惯了 Markdown 来记录笔记,所以编辑时使用的是 Markdown。但是在网站展示时,
    希望将其转换为 HTML。

    于是,搜索了一下 C# 相关的 Markdown 库。找到一个 Markdig 的库:

    https://github.com/xoofx/markdig

    但是,这个不能直接在 ASP.NET Core MVC 的 Razor 代码文件中使用。
    需要自己封装一下。还是太麻烦了,于是找了另一个基于 Markdig 封装好的库。

    https://github.com/RickStrahl/Westwind.AspNetCore.Markdown

    ASP.NET Core Markdown Support

    ⚡️ 安装依赖

    dotnet.exe add package westwind.aspnetcore.markdown
    

    安装后,会看到 xxx.proj 文件中,新增了配置

    <ItemGroup>
      <PackageReference Include="westwind.aspnetcore.markdown" Version="3.21.0" />
    </ItemGroup>
    

    🔨 .NET 8.0 中使用 westwind.aspnetcore.markdown

    由于官方示例中是 ASP.NET Core 3.0 的用法,而 .NET 8 的 ASP 写法已经变化。看了几个 github 项目才搞明白怎么用。

    .NET 8 的用法:

    Program.cs

    using Westwind.AspNetCore.Markdown;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.AddMarkdown();
    
    // ...
    
    var app = builder.Build();
    // must be configured before app.UseRouting()!
    app.UseMarkdown();
    app.UseRouting();
    
    // ...
    
    app.Run();
    

    Index.cshtml razor 模板文件中:

    @using Westwind.AspNetCore.Markdown
    
    <div>
        @Markdown.ParseHtmlString("## Hello world!")
    </div>
    

    ✅ 完成,这样就能看到 Markdown 格式被转换成了 HTML 格式。

    ❎ 报错

    在 cs 代码文件,及 cshtml 文件中,都不用忘了引入这个库

    using Westwind.AspNetCore.Markdown;
    
    @using Westwind.AspNetCore.Markdown
    

    否则会报错:

    Program.cs(6,18): error CS1061: 'IServiceCollection' does not contain a definition for 'AddMarkdown' and no accessible extension method 'AddMarkdown' accepting a first argument of type 'IServiceCollection' could be found (are you missing a using directive or an assembly reference?)
    
    Program.cs(39,5): error CS1061: 'WebApplication' does not contain a definition for 'UseMarkdown' and no accessible extension method 'UseMarkdown' accepting a first argument of type 'WebApplication' could be found (are you missing a using directive or an assembly reference?)
    
    Index.cshtml(95,6): error CS0103: The name 'Markdown' does not exist in the current context
    

    在 VIM 中开发,不使用 Visual Studio 这样的智能 IDE,就是会有这个烦恼。

    🌍 I18N 多语言翻译资源的 markdown 转换

    如果在翻译用的资源文件中使用了 markdown,然后想在 Razor 中进行 HTML 转换,会报错:

    cannot convert from ‘Microsoft.AspNetCore.Mvc.Localization.LocalizedHtmlString’ to ‘string’

    正确的写法是,通过 .Value 将 LocalizedHtmlString 转换为 string:

    @Markdown.ParseHtmlString(@Localizer["Content"].Value)
    

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式