ASP.Net Core中AJAX请求下TempData.Keep()失效问题求助
解决ASP.NET Core中AJAX请求下TempData.Keep()失效的问题
可能的原因及解决思路
1. Session中间件顺序错误
TempData基于Session存储时,必须保证app.UseSession()的调用顺序正确,否则Session无法正常工作,直接导致TempData丢失。
在Startup.cs的Configure方法中,中间件需按以下顺序配置:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 必须放在UseRouting之后、UseAuthorization之前 app.UseSession(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
2. Session Cookie配置缺失或不合理
Session依赖Cookie传递Session ID,若Cookie配置不当,会导致Session无法维持:
在ConfigureServices中完善Session配置:
services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); // 设置Session过期时长 options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; // 标记为必要Cookie,避免GDPR拦截 options.Cookie.SameSite = SameSiteMode.Lax; // 适配AJAX请求的Cookie传递规则 });
3. TempData读取与Keep的时机问题
虽然你已调用TempData.Keep("Name"),可尝试改用TempData.Peek()方法读取——该方法读取值时不会标记TempData为删除,无需额外调用Keep:
修改Report_ChangeYear方法:
[HttpGet] public JsonResult Report_ChangeYear(int year, int month) { // 使用Peek读取,不会触发TempData的删除标记 string sName = TempData.Peek("Name"); // 后续业务逻辑... }
若坚持使用TempData["Name"]读取,需确保读取后立即调用Keep,避免中间逻辑干扰:
string sName = TempData["Name"]; // 读取后立刻执行Keep,不要延后到后续逻辑之后 TempData.Keep("Name");
4. AJAX请求未正确携带Session Cookie
默认jQuery AJAX会自动携带Cookie,但可显式配置确保:
$.ajax({ url: '@Url.Action("Report_ChangeYear", "Home")?year=' + yearVal + '&month=' + monthVal, type: 'GET', xhrFields: { withCredentials: true // 显式要求携带Cookie }, // 其他原有配置... });
验证步骤
- 确认
InitializeReport方法已被正确调用,TempData["Name"]确实完成赋值 - 打开浏览器开发者工具的
Application标签,检查Session Cookie是否存在且未过期 - 查看AJAX请求的请求头,确认
Cookie字段包含Session ID
内容的提问来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

