如何在ASP.NET MVC中不通过路由在Action间传递数据?
解决重定向时传递复杂对象的问题
你遇到的问题根源在于:RedirectToAction 会发起302重定向,这是一个全新的HTTP请求。你传入的result.User对象会被自动拆解成路由参数或查询字符串,复杂对象无法通过这种方式完整传递,因此Home控制器的Index方法无法正确接收User对象。
下面提供两种无需通过路由参数传递数据的解决方案:
方案1:使用TempData传递对象
TempData适合在重定向的请求之间临时存储数据,默认基于Session实现,且读取后会自动清除(可通过Keep()保留)。
修改Users控制器的LoginCheck方法
public IActionResult LoginCheck(UserForm user) { AuthUser auth = new AuthUser(_context); var result = auth.IsLoggedIn(user.Email, user.Password); if(result.isfound == false) { return NotFound(); } result.User.IsAuth = true; // 序列化User对象并存入TempData var userJson = System.Text.Json.JsonSerializer.Serialize(result.User); TempData["LoggedInUser"] = userJson; return RedirectToAction("Index", "Home"); }
修改Home控制器的Index方法
public async Task<IActionResult> Index() { // 从TempData中取出并反序列化User对象 if (TempData["LoggedInUser"] is not string userJson) { return Unauthorized(); } var user = System.Text.Json.JsonSerializer.Deserialize<User>(userJson); if(user == null || user.IsAuth == false) { return Unauthorized(); } // 后续业务逻辑 }
方案2:使用Session存储用户信息
Session适合需要在多个请求间持久保留用户信息的场景,需先启用Session功能。
第一步:启用Session
在Program.cs中添加Session配置:
// 注册Session服务 builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); // 设置会话超时时间 options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; }); // 在中间件管道中启用Session(需放在UseRouting之后,UseAuthorization之前) app.UseSession();
修改Users控制器的LoginCheck方法
public IActionResult LoginCheck(UserForm user) { AuthUser auth = new AuthUser(_context); var result = auth.IsLoggedIn(user.Email, user.Password); if(result.isfound == false) { return NotFound(); } result.User.IsAuth = true; // 序列化User对象并存入Session var userJson = System.Text.Json.JsonSerializer.Serialize(result.User); HttpContext.Session.SetString("LoggedInUser", userJson); return RedirectToAction("Index", "Home"); }
修改Home控制器的Index方法
public async Task<IActionResult> Index() { // 从Session中取出并反序列化User对象 var userJson = HttpContext.Session.GetString("LoggedInUser"); if(string.IsNullOrEmpty(userJson)) { return Unauthorized(); } var user = System.Text.Json.JsonSerializer.Deserialize<User>(userJson); if(user == null || user.IsAuth == false) { return Unauthorized(); } // 后续业务逻辑 }
注意事项
- 若User对象包含敏感信息(如密码),存入TempData/Session前务必移除这些字段,避免数据泄露。
- 确保User类可被序列化(无循环引用、无不可序列化的属性等)。
内容的提问来源于stack exchange,提问作者Islam Alsaadawy
相关产品推荐
相关产品推荐

