快速总结:在 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 来管理这个更好的模式?
客户的要求是继续使用会话,因此避免它们并不是一个真正的选择。