ASP.NET Core中Razor引擎生成URL时&转义异常导致激活链接失效问题
解决ASP.NET Core Razor模板生成激活邮件时&被转义导致的参数解析问题
这个问题我之前也碰到过,核心原因是Razor引擎默认会对HTML输出中的特殊字符进行编码,所以你用@Model.Url输出链接时,URL里的&会被转成&——这在标准HTML里是合规的,但有些邮件客户端(比如Gmail)在解析或者显示纯文本链接时,会把&当成实际的参数分隔符,导致userId参数被截断,最终变成null。
下面给你两个靠谱的解决办法:
方法一:用Html.Raw()输出原始URL
直接在Razor模板里告诉引擎不要编码这个URL字符串,把模板里的链接代码改成:
<p><a href="@Html.Raw(Model.Url)" class="button">ACTIVATE MY ACCOUNT</a></p>
Html.Raw()会跳过Razor的自动编码逻辑,直接输出你生成的原始URL,这样链接里的&就会保留成原本的样子,不管邮件客户端是渲染HTML还是显示纯文本,都能正确解析出code和userId两个参数。
方法二:提前处理URL(可选)
如果你不想在模板里用Html.Raw(),也可以在生成activationMailViewModel.Url之后,手动确保URL不被后续编码,但这个方法不如第一种直接。不过原理是一样的——保证最终输出到邮件里的URL是原始的、未被HTML编码的格式。
验证效果
修改后,生成的邮件HTML里的链接href会是:
http://base.url.net/Account/ConfirmEmail?code=xxx&userId=xxx
而不是带&的版本,这样不管是ProtonMail还是Gmail,用户点击链接时,AccountController的ConfirmEmail方法都能正确获取到code和userId参数,不会再出现激活失败的情况。
内容的提问来源于stack exchange,提问作者Natalie Perret
相关产品推荐
相关产品推荐

