You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动