ASP.NET MVC中HTML表格动态数据切换失效问题求助
问题分析与解决方案
我一眼就看出问题所在了——浏览器缓存了你的GET请求结果,另外你用静态变量i的方式也存在多用户场景下的隐患,咱们一步步解决:
核心问题:GET请求被浏览器缓存
你用$.get发起的是GET请求,浏览器默认会对相同URL的GET请求进行缓存。第一次点击后,浏览器把返回的表格HTML存在了缓存里,第二次点击时直接从缓存读取内容,根本没触发后端ShowGrid Action的执行,所以你的静态变量i根本没机会更新,自然两次显示的内容一模一样。
另外的隐患:静态变量i的风险
ASP.NET MVC的Controller是每次请求都会创建实例,但静态变量是应用域全局共享的——如果有多个用户同时点击按钮,这个i会被所有用户共享,导致数据混乱,绝对不能用这种方式来控制用户级别的状态。
具体解决方案
方案1:禁用AJAX的GET请求缓存
在你的jQuery AJAX请求里加上cache: false,这样浏览器就不会缓存这次请求的结果:
$(function () { $('#btnClick').click(function () { $.get({ url: '@Url.Action("ShowGrid","Test")', cache: false, success: function (data) { $('#divTest').replaceWith(data); } }); }); });
或者直接用$.ajax方法明确设置:
$.ajax({ url: '@Url.Action("ShowGrid","Test")', type: 'GET', cache: false, success: function(data) { $('#divTest').replaceWith(data); } });
方案2:改用POST请求(更稳妥)
POST请求默认不会被浏览器缓存,同时修改后端Action的特性为[HttpPost]:
前端代码修改:
$(function () { $('#btnClick').click(function () { $.post('@Url.Action("ShowGrid","Test")', function (data) { $('#divTest').replaceWith(data); }); }); });
后端Controller修改:
[HttpPost] // 把HttpGet改成HttpPost public PartialViewResult ShowGrid() { // 你的逻辑代码... }
方案3:替换静态变量,用用户级别的状态存储
把静态变量i换成Session来存储,这样每个用户的状态是独立的,不会互相影响:
[HttpGet] public PartialViewResult ShowGrid() { // 从Session获取i,默认值为1 int i = Session["DataIndex"] != null ? (int)Session["DataIndex"] : 1; List<Employee> _emplyeeList; if (i == 1) { _emplyeeList = new List<Employee>(); _emplyeeList.Add(new Employee() { Name = "Steve", ID = "1", Department = "IT", Salary = 1000 }); _emplyeeList.Add(new Employee() { Name = "Samules", ID = "2", Department = "Telecom", Salary = 2000 }); _emplyeeList.Add(new Employee() { Name = "Edward", ID = "3", Department = "Sales", Salary = 3000 }); Session["DataIndex"] = 2; // 更新Session值 } else { _emplyeeList = new List<Employee>(); _emplyeeList.Add(new Employee() { Name = "Prateek", ID = "1", Department = "IT", Salary = 1000 }); _emplyeeList.Add(new Employee() { Name = "Partho", ID = "2", Department = "Telecom", Salary = 2000 }); _emplyeeList.Add(new Employee() { Name = "Pinaki", ID = "3", Department = "Sales", Salary = 3000 }); Session["DataIndex"] = 1; // 可以重置为1,实现切换效果 } ViewBag.Details = _emplyeeList; return PartialView("partial"); }
验证方法
修改后,你可以打开浏览器的开发者工具(F12),切换到Network标签,然后点击按钮,观察两次请求是否都发送到了后端,并且返回了不同的响应内容。
内容的提问来源于stack exchange,提问作者PRATEEK GHOSH




