You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");

默认jQuery AJAX会自动携带Cookie,但可显式配置确保:

$.ajax({
    url: '@Url.Action("Report_ChangeYear", "Home")?year=' + yearVal + '&month=' + monthVal,
    type: 'GET',
    xhrFields: {
        withCredentials: true // 显式要求携带Cookie
    },
    // 其他原有配置...
});

验证步骤

  1. 确认InitializeReport方法已被正确调用,TempData["Name"]确实完成赋值
  2. 打开浏览器开发者工具的Application标签,检查Session Cookie是否存在且未过期
  3. 查看AJAX请求的请求头,确认Cookie字段包含Session ID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:15:33