使用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
相关产品推荐
相关产品推荐

