Blazor中使用带Subject和Body的mailto链接实现带变量发邮件的问题
问题原因
- 直接在href属性中拼接未编码的变量值,
@ErrorCode、@navigationManager.Uri中如果包含&、空格、换行、中文等特殊字符,会破坏mailto的query参数结构,导致body参数被截断无法识别 - 手动编写的
%0D%0A转义换行符可能在Razor渲染时被二次转义,导致格式失效
解决方案
不要直接在href属性里拼接参数,提前用URL编码方法处理所有参数内容后再生成完整的mailto链接,示例代码如下:
@* 首先注入NavigationManager *@ @inject NavigationManager NavigationManager @{ // 1. 直接编写原始的主题、正文内容,不需要手动加转义符 string mailSubject = $"MessageCode: {ErrorCode}"; string mailBody = $"Test Test,\r\n\r\nURL: {NavigationManager.Uri}"; // 2. 对参数单独做URL编码,自动处理所有特殊字符、换行、空格 string encodedSubject = Uri.EscapeDataString(mailSubject); string encodedBody = Uri.EscapeDataString(mailBody); // 3. 拼接生成完整的mailto链接 string fullMailToLink = $"mailto:?subject={encodedSubject}&body={encodedBody}"; } @* 绑定生成好的链接即可 *@ <a href="@fullMailToLink">发送邮件</a>
实现说明
Uri.EscapeDataString是.NET内置的URL参数编码方法,会自动将空格、换行、特殊符号转换为符合URI规范的转义字符,避免破坏参数结构- 不需要手动编写
%20、%0D%0A这类转义字符,直接写原始文本和换行即可,编码方法会自动处理对应转义 - 如果需要指定固定收件人,直接把收件人地址写在
mailto:后面即可,示例:string fullMailToLink = $"mailto:m.mustermann@domain.de?subject={encodedSubject}&body={encodedBody}";
内容的提问来源于stack exchange,提问作者MaxB
相关产品推荐
相关产品推荐

