.NET Core 2.0中HTML5 UTF-8编码显示异常问题排查
看起来你遇到的是Razor自动HTML编码导致特殊字符被转义成实体的问题,尤其是在JavaScript代码块里的变量赋值环节,这是ASP.NET Core Razor开发里很容易踩的坑。
核心问题分析
你在<script>里用了这样的代码:
@:name = '@requestModel.Name'; @:surname = '@requestModel.SurName'; @:emailAddress = '@mapResponse.EmailAddress';
Razor引擎为了防止XSS攻击,会自动对@requestModel.Name这类C#表达式的输出做HTML编码——这就导致Ö、Ü这类特殊字符被转成Ö、Ü这种HTML实体,直接赋值给JS变量后,自然就显示成转义后的内容了。
而你页面里的Html.TextBoxFor其实是正常的,因为这个Helper会正确处理模型字符串的编码逻辑,输入框里应该能正常显示特殊字符,问题主要出在JS变量的赋值部分。
解决步骤
1. 修复JavaScript变量赋值的编码问题
别再用字符串拼接的方式把C#变量嵌入JS了,改用Json.Serialize安全序列化对象,既能避免HTML编码,又能保证JS语法合法:
<script> $(document).ready(function () { var name = ''; var surname = ''; var emailAddress = ''; @if (mapResponse.CurrentEmployee != null) { var employeeData = new { Name = requestModel.Name, SurName = requestModel.SurName, EmailAddress = mapResponse.EmailAddress }; @:var employee = @Json.Serialize(employeeData); @:name = employee.Name; @:surname = employee.SurName; @:emailAddress = employee.EmailAddress; } }); </script>
Json.Serialize会把C#对象转成合法的JSON字符串,Razor不会对它的输出做HTML编码,特殊字符就能完整保留下来。
2. 验证后端模型的字符编码
确保你的RequestModel里的Name、Surname属性在后端接收或存储时就是正确的UTF-8字符串:
- 如果是从数据库读取,确认数据库字符集是UTF-8(比如MySQL用
utf8mb4,SQL Server用NVARCHAR类型); - 如果是从请求里接收,ASP.NET Core默认是UTF-8编码,但可以在
Startup.cs里显式配置本地化与编码:
public void ConfigureServices(IServiceCollection services) { services.Configure<RequestLocalizationOptions>(options => { options.DefaultRequestCulture = new RequestCulture("tr-TR"); options.SupportedCultures = new List<CultureInfo> { new CultureInfo("tr-TR") }; options.SupportedUICultures = new List<CultureInfo> { new CultureInfo("tr-TR") }; }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseRequestLocalization(); // ...其他中间件配置 }
3. 再次确认视图文件编码
虽然你已经把文件从UTF-8 BOM改成了UTF-8,但可以再检查一遍:
- 在Visual Studio里右键视图文件 → 属性 → 高级 → 编码,确认是
UTF-8 (无签名); - 如果用其他编辑器,保存时务必选择UTF-8无BOM格式。
额外检查
如果页面里的Html.TextBoxFor也出现编码问题(虽然你没提到,但以防万一),可以在确定内容安全的前提下用Html.Raw输出:
@Html.TextBoxFor(e => e.Name, new { @class = "form-control", @id = "employeeName", @value = Html.Raw(requestModel.Name) })
不过通常Html.TextBoxFor会自动处理模型字符串,这个操作大概率不需要,重点还是解决JS部分的问题。
内容的提问来源于stack exchange,提问作者KaraKaplan




