【问题标题】:Html.Encode vs Html.RawHtml.Encode 与 Html.Raw
【发布时间】:2022-11-29 23:10:03
【问题描述】:
在.NET framework 中HTMLEncode 会在视图文件中编码特殊字符(如匈牙利语、中文字母)并正确显示它们,而在.NET 6 中HTMLEncode 将它们显示为例如á
我正在使用 UTF-8 编码并且所有文件都正确设置为它。我查看了 Microsoft 文档,发现这些类来自不同的Assembly。我在这里错过了什么吗?
我的目标是不显示特殊字符。我知道HtmlRaw,但这是安全且最好的方式吗?
【问题讨论】:
标签:
.net
razor
encoding
asp.net-core-mvc
razor-pages
【解决方案1】:
默认情况下,非拉丁字符由 ASP.NET Core 中的 Razor 进行 HTML 编码。当您自己对它们使用 HTMLEncode 时,您基本上是对它们进行双重编码,以便它们呈现为编码版本。如果您将 Html.Raw 应用于双重编码结果,您只需反转您的 HTMLEncode 操作。
简而言之,在 ASP.NET Core 中不需要 HTMLEncode 非拉丁字符,因为框架会为您完成。但是,您可能决定不喜欢 HTML 源代码中这些字符的 HTML 等价物,在这种情况下,您可以配置编码器选项以防止默认编码器执行它们所做的事情,并允许浏览器的 UTF-8 支持处理事情:
builder.Services.Configure<WebEncoderOptions>(options =>
{
options.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.BasicLatin, UnicodeRanges.Latin1Supplement);
});
请注意,无论您在此处设置什么,都会覆盖默认设置,这就是为什么您需要包含 BasicLatin 范围的原因。如果您不确定应该包含哪些字符集,可以在这里查看:http://www.unicode.org/charts/。或者,您可以简单地指定UnicodeRanges.All。