.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]和绑定特性,就会触发这个问题。
修复方案
按优先级逐一验证即可解决:
- 首先修改ConfirmEmail页面对应的PageModel类:
找到带[TempData]标记的UserId属性,要么将属性类型改为Guid,要么如果不需要用TempData传递该值,直接删除[TempData]特性即可——你的OnGet方法已经直接从请求参数中获取了userId,不需要依赖TempData传值,移除特性是最简单的方案。 - 优化链接生成逻辑,避免隐式类型转换隐患:
生成回调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);
- 如果以上两步都无法解决,检查项目中是否自定义了
ITempDataProvider实现,修改了TempData的默认序列化逻辑,导致Guid类型的值读取时类型异常,恢复默认实现或者调整序列化规则即可。
内容的提问来源于stack exchange,提问作者RusskiT
相关产品推荐
相关产品推荐

