ASP.NET Core 6 Razor Pages登录错误HTML消息显示为纯文本问题
解决ASP.NET Core 6.0 Razor Pages HTML错误消息不解析的问题
问题原因
- 手动编码错误:你在后端调用了
WebUtility.HtmlEncode(invalidLogin),这会把<b>这类HTML标签转义成<b>,直接导致消息变成纯文本。 - 默认自动编码:Razor Pages自带的验证组件(如
asp-validation-summary)会对ModelState中的错误消息自动做HTML编码,即便后端传递原始HTML标签,也会被转义后显示。
解决方案
步骤1:修正后端代码,移除不必要的HTML编码
删掉WebUtility.HtmlEncode调用,直接把带HTML标签的错误消息添加到ModelState:
var invalidLogin = await LockOut(Input.UserUserName, Input.Password); if (!string.IsNullOrEmpty(invalidLogin)) { // 移除HtmlEncode,直接传递原始HTML格式的消息 ModelState.AddModelError(string.Empty, invalidLogin); return Page(); }
注意:如果错误消息包含用户输入的内容(比如用户名),必须单独对用户输入部分编码,避免XSS风险:
// 对用户输入的用户名做HTML编码 var encodedUserName = WebUtility.HtmlEncode(Input.UserUserName); // 拼接安全的HTML消息 invalidLogin = $"Invalid: <b>{encodedUserName}</b> and/or <b>Password</b>";
步骤2:修改前端页面,用Html.Raw渲染错误消息
默认的asp-validation-summary会自动编码消息,因此需要替换为手动遍历ModelState错误并使用Html.Raw跳过编码:
把原来的验证摘要代码(比如<div asp-validation-summary="All" class="text-danger"></div>)替换为:
@if (!ViewData.ModelState.IsValid) { <div class="text-danger"> @foreach (var error in ViewData.ModelState.Values.SelectMany(v => v.Errors)) { @Html.Raw(error.ErrorMessage) <br /> } </div> }
这样就能正确解析<b>标签,将"User Name"和"Password"显示为加粗样式。
额外说明
- 如果想继续使用
asp-validation-summary,可以通过自定义标签助手或修改验证模板实现,但手动遍历+Html.Raw是最直接的方案。 - 务必确保HTML消息中的用户输入部分经过HTML编码,防范跨站脚本攻击(XSS)。
内容的提问来源于stack exchange,提问作者Massey
相关产品推荐
相关产品推荐

