ASP.NET MVC:Razor视图中单引号显示异常问题求助
关于Razor视图中Alert弹窗单引号变奇怪字符的原因解析
嗨,这个问题我之前踩过一模一样的坑!核心原因其实是Razor的自动HTML编码机制在搞鬼,咱们一步步拆解:
为什么从Razor变量取值会出问题?
Razor视图默认会对输出到页面的内容做HTML编码,目的是防止XSS攻击。当你的变量里包含单引号(')时,Razor会把它转成对应的HTML实体 ' —— 这个实体在HTML里会被解析成单引号,但如果直接塞进JavaScript字符串里,JS不会自动解码它,所以弹窗里就会显示成你看到的“以#开头的奇怪字符”(其实就是'的字面内容)。
举个错误写法的例子,一看就懂:
@{ var userMessage = "It's a Razor test"; } <script> // Razor编译后会把@userMessage转成It's a Razor test alert('@userMessage'); // 弹窗显示:It's a Razor test </script>
为什么直接传字符串正常?
当你直接在JS里写字符串时,你是遵循JavaScript的语法规则来处理单引号的:要么用双引号包裹带单引号的内容(alert("It's a test")),要么手动转义单引号(alert('It\'s a test'))。这时候没有经过Razor的编码,自然显示正常。
怎么解决这个问题?
要让Razor输出符合JavaScript语法的字符串,得用正确的转义方式:
- .NET Framework项目:用
Json.Encode配合Html.Raw,前者把字符串转成合法的JS格式,后者避免Razor二次编码:@{ var userMessage = "It's a Razor test"; } <script> alert(@Html.Raw(Json.Encode(userMessage))); </script> - .NET Core/.NET 5+项目:直接用
Json.Serialize就行,它输出的内容本身就是合法的JS字符串,Razor不会额外编码:@{ var userMessage = "It's a Razor test"; } <script> alert(@Json.Serialize(userMessage)); </script>
这样处理后,弹窗里的单引号就能正常显示啦!
内容的提问来源于stack exchange,提问作者aj go




