You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RazorTemplatePreprocessor时,如何让模板生成WriteLiteral而非Write调用?

解决Razor预编译模板自动HTML编码问题

场景说明

在控制台应用中使用旧版Visual Studio的RazorTemplatePreprocessor(通过文件属性设置为Custom Tool的预编译Razor模板),保存.cshtml文件时会自动生成C#类,运行时将模板转为HTML字符串。但模板中使用@Model.GetMyString()这类指令时,生成的C#代码会调用Write(Model.GetMyString()),该方法会通过WebUtility.HtmlEncode自动编码字符串,导致原HTML格式被转义,而@Html.Raw指令无法被该预处理器识别。

解决方案

方法1:包装返回值为IHtmlString类型

Razor预编译模板对实现IHtmlString接口的对象会自动调用WriteLiteral方法(不进行HTML编码)。可以在模型类中新增一个方法,将目标字符串包装为HtmlString实例:

using System.Web; // .NET Core环境请引用Microsoft.AspNetCore.Html

public class YourModel
{
    public string GetMyString()
    {
        // 原返回HTML格式字符串的逻辑
        return "<p>带HTML标签的内容</p>";
    }

    public IHtmlString GetMyRawString()
    {
        // 将结果包装为IHtmlString
        return new HtmlString(GetMyString());
    }
}

在模板中调用该方法即可原样输出:

@Model.GetMyRawString()

方法2:模板内直接包装

如果不想修改模型类,可直接在.cshtml模板中手动将字符串包装为HtmlString:

@(new HtmlString(Model.GetMyString()))

原理说明

Razor预编译模板的生成逻辑会根据输出值的类型选择调用方法:

  • 普通字符串类型:调用Write(),自动执行HTML编码
  • IHtmlString类型:调用WriteLiteral(),直接输出原始内容

内容的提问来源于stack exchange,提问作者user764754

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:04:52