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

ASP.NET中IndexAsync被调用两次且第二次Session变量丢失问题

问题解决思路与方案

一、先解决两次请求的核心问题

你的按钮是type="submit",如果它被包裹在<form>标签内,点击时会同时触发表单默认提交行为和你绑定的JS跳转逻辑,这就是两次请求的根源,和异步操作无关。即使你用了.one(),也只是限制了JS逻辑只执行一次,但表单的默认提交还是会触发第二次请求。

修复方案(二选一即可)

  1. 修改按钮类型为button
    把按钮的type="submit"改成type="button",彻底避免默认提交行为:

    <div class="col-md-4">
      <button type="button" id="ViewHoursbutton" name="ViewHours" class="btn btn-primary button-bottom" >View Hours</button>
    </div>
    
  2. 在JS中阻止默认事件
    如果必须保留type="submit",在点击事件中添加preventDefault()阻止表单提交:

    $(document).ready(function () 
    {
       $("#ViewHoursbutton").one("click", function (e) 
       {
           e.preventDefault(); // 阻止表单默认提交
           window.location.href = "/ETime?EmployeeID=" + employeeID;
       });
    });
    

二、Session丢失的问题解释与修复

第二次请求SessionID变更、Session对象消失,是因为两次请求中,第二次请求属于新的会话——原因是第一次请求还没完成Session的初始化/写入,第二次请求就已经发起,导致服务器无法识别会话;或者第二次请求没有携带正确的Session Cookie。

解决了两次请求的问题后,这个Session丢失的情况会自然消失。此外,你可以检查ASP.NET Core的Session配置是否正确:

  • 确保Program.cs中添加了Session服务并启用:
    builder.Services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromMinutes(30);
        options.Cookie.HttpOnly = true;
        options.Cookie.IsEssential = true;
    });
    
    app.UseSession(); // 必须放在UseRouting之后,UseAuthorization之前
    

额外优化建议

控制器的IndexAsync方法可以简化,else分支里的重复赋值可以去掉:

// 原else分支重复赋值可简化为:
DynModel.TrackingItems = trackingItems; // 不管count是否为0,直接赋值即可,空集合和null在视图中可以统一处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:46:46