You need to enable JavaScript to run this app. .NET Core点击邮箱验证链接报错:无法将System.GUID转为System.String
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core点击邮箱验证链接报错:无法将System.GUID转为System.String

根因分析

这个异常本质是Razor Page的PageModel中标记了[TempData]特性的属性与TempData存储的对应值类型不匹配导致的:
从报错堆栈可以看到,框架在请求初始化阶段,会自动将TempData字典中存储的值赋值给PageModel中带[TempData]标记的属性,此时TempData里存储的UserId对应的值是Guid类型,但你PageModel中声明的UserId属性是string类型,类型不匹配直接抛出转换异常。
你代码中生成链接时直接传入了user.Id(你的Identity用户主键是Guid类型),如果你在其他逻辑中曾经将Guid类型的UserId直接存入过TempData["UserId"],或者你的PageModel的UserId属性同时标记了[TempData]和绑定特性,就会触发这个问题。

修复方案

按优先级逐一验证即可解决:

  1. 首先修改ConfirmEmail页面对应的PageModel类:
    找到带[TempData]标记的UserId属性,要么将属性类型改为Guid,要么如果不需要用TempData传递该值,直接删除[TempData]特性即可——你的OnGet方法已经直接从请求参数中获取了userId,不需要依赖TempData传值,移除特性是最简单的方案。
  2. 优化链接生成逻辑,避免隐式类型转换隐患:
    生成回调Url时,显式将Guid类型的用户Id转为字符串:
var callbackUrl = Url.Page(      
    "/Account/ConfirmEmail",
    pageHandler: null,
    values: new { area = "Identity", userId = user.Id.ToString(), code = codeBytes, returnUrl = svm.Input.ReturnUrl },
    protocol: Request.Scheme);
  1. 如果以上两步都无法解决,检查项目中是否自定义了ITempDataProvider实现,修改了TempData的默认序列化逻辑,导致Guid类型的值读取时类型异常,恢复默认实现或者调整序列化规则即可。

内容的提问来源于stack exchange,提问作者RusskiT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 10:57:01