ASP.NET中IndexAsync被调用两次且第二次Session变量丢失问题
问题解决思路与方案
一、先解决两次请求的核心问题
你的按钮是type="submit",如果它被包裹在<form>标签内,点击时会同时触发表单默认提交行为和你绑定的JS跳转逻辑,这就是两次请求的根源,和异步操作无关。即使你用了.one(),也只是限制了JS逻辑只执行一次,但表单的默认提交还是会触发第二次请求。
修复方案(二选一即可)
修改按钮类型为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>在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
相关产品推荐
相关产品推荐

