0

快速总结:在 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 Ok(); 管理控制器返回请求。返回 BadRequest(....);

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

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

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

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

4

0 回答 0