微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Asp .NET Core MVC:jQuery Ajax、异步等待和会话数据管理

如何解决Asp .NET Core MVC:jQuery Ajax、异步等待和会话数据管理

快速总结: 在 ASP.NET Core (Net 5) MVC 项目中,我需要一种方法来在单个页面(网格、仪表板,都在同一页面中)中保持对齐和同步各种控件, 使用一些保存其数据的会话变量(我知道,糟糕的设计决策,但现在不允许我做出决定)。这些控件通过对 MVC 控制器的 ajax 请求进行交互和更改会话数据。 这样做的最佳方式/模式是什么?

长详细版本: 我必须将旧的 ASP.NET WebForms 移植到带有 Razor 页面的 ASP.NET Core MVC 应用程序。 我有一个包含各种网格的页面,其行为如下(也在旧应用程序中):

当控制器启动网格时,检查它们的数据源是否在 HttpContext.Session["key"] 中,如果是,则从 session 中获取,否则从 db 中获取并放入 session,这样,下次重新加载时,它会从会话中取出。

现在是关键部分。 其中一个网格的按钮可以打开弹出窗口并修改其他与会话直接交互的网格的数据,因此其他网格从会话键重新加载数据。

基本概念是,在此页面中发生的对网格数据的每次修改都存在于会话变量中(每个网格都有自己的),并且实际调用 db 以获取数据仅在页面第一次加载时发生在会议中。页面数据编辑完成后,保存并全部提交到数据库并释放会话变量。

我的问题是:

我从网格修改数据并调用一个 jquery ajax:

$.ajax({
            url: '@Url.Action("ManageSession","SessionManagement")',type: "POST",contentType: 'application/json; charset=utf-8',dataType: "json",data: postData,success: function (result) {
                showMessage(result.responseText,result.success ? 'success' : 'error',3000)
            },error: function (error) {
                showMessage(result.responseText,'success',3000)
            }
        });

这是控制器

 [HttpPost]
        public async Task<JsonResult> ManageSession([FromBody] ManageSessionModel manageSession)
        {
            try
            {
                var Grid1Dataaa = this.HttpContext.Session.Get<List<Grid1Data>>("SessionKeyTest1");
                var Grid2Dataaa = this.HttpContext.Session.Get<List<Grid2Data>>("SessionKeyTest1");

                switch (manageSession.actionType)
                {
                    case "add":
                        try
                        {

                            return Json(new { success = true,responseText = $"{manageSession.ids.Length} elements have been added" });
                        }
                        catch (Exception)
                        {
                            return Json(new { success = false,responseText = "An error happened while trying to add the selected deviations" });
                            throw;
                        }
                    case "remove":
                        try
                        {
                            return Json(new { success = true,responseText = $"{manageSession.ids.Length} elements have been removed" });
                        }
                        catch (Exception)
                        {
                            return Json(new { success = false,responseText = "An error happened while trying to remove the selected deviations" });
                            throw;
                        }
                    default:
                        return Json(new { success = false,responseText = "There are no items selected to remove or add" });
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

我的疑问是 ajax 如何管理异步控制器操作。

如果我调用 ajax 并且用户多次点击按钮会发生什么?

会话被同时修改多次? 我不知道 jquery ajax 是否立即将控制器和控件调用到 javascript 并触发多个请求以允许多个线程修改会话?

还是 ajax 将异步调用排入队列并一个一个执行?

我不知道 ajax 成功/错误事件是否仅仅基于 HTTP 200 返回,即使控制器触发错误

我还考虑过管理控制器返回请求 返回确定(); return BadRequest(....);

因为这可能是管理 ajax 错误/成功的更好方法

我也考虑过将 ajax async 设置为 false 以使其同步。

谁能建议我使用 MVC 中的会话和 ajax 来管理这个更好的模式?

客户要求继续使用会话,因此避免使用会话并不是真正的选择。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。