ASP.NET Core 6.0 Identity:如何向Razor页面传递复杂对象?
ASP.NET Core 6 Identity 传递ApplicationUser对象到LoginWith2fa页面的问题解决
问题根源
RedirectToPage发起的是GET请求,复杂对象(如ApplicationUser)无法通过URL查询字符串直接完成模型绑定——绑定器只会创建对象实例,但不会自动填充其属性。而bool、string这类简单类型能正常绑定,所以你看到rememberMe和returnUrl值正确,但UserSent的属性全为null。
解决方案
方案1:传递用户ID,在目标页面重新查询用户
这是最安全且符合Identity设计规范的方式:
- 登录页修改代码:
return RedirectToPage("./LoginWith2fa", new { UserId = user.Id, ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
- LoginWith2fa页面修改代码:
private readonly UserManager<ApplicationUser> _userManager; // 通过构造函数注入UserManager public LoginWith2faModel(UserManager<ApplicationUser> userManager) { _userManager = userManager; } public async Task<IActionResult> OnGetAsync(string userId, bool rememberMe, string returnUrl = null) { if (string.IsNullOrEmpty(userId)) { return BadRequest("用户ID不能为空"); } var user = await _userManager.FindByIdAsync(userId); if (user == null) { return NotFound("未找到指定用户"); } // 此处user的所有属性将正常赋值,可继续后续业务逻辑 }
方案2:使用TempData临时存储序列化后的对象
适合不需要持久化、仅重定向场景传递数据:
- 登录页修改代码:
using System.Text.Json; // 将用户对象序列化后存入TempData TempData["ApplicationUser"] = JsonSerializer.Serialize(user); return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
- LoginWith2fa页面修改代码:
using System.Text.Json; public async Task<IActionResult> OnGetAsync(bool rememberMe, string returnUrl = null) { if (TempData["ApplicationUser"] == null) { return BadRequest("未获取到用户信息"); } var user = JsonSerializer.Deserialize<ApplicationUser>(TempData["ApplicationUser"].ToString()); if (user == null) { return NotFound("用户信息解析失败"); } // 此处可正常使用user对象 }
注意:如果
ApplicationUser存在循环引用,序列化时需配置JsonSerializerOptions忽略循环引用,或仅序列化需要的属性。
内容的提问来源于stack exchange,提问作者Massey
相关产品推荐
相关产品推荐

