将 ASP.NET Core 8 MVC 与 jquery-ajax-unobtrusive 结合使用,但是处理意外异常的最佳方法是什么?

问题描述 投票:0回答:1

我正在使用 jquery-ajax-unobtrusive 对 ASP.NET Core 8 MVC Web 应用程序中的控制器端点进行 ajax 调用。

如果成功,端点将返回

PartialView
,并且在成功 200 时按预期工作。

但是,我正在努力解决的是如何处理意外异常的最佳实践。例如。数据库在保存过程中超时。

我可以挂接到 data-ajax-failure="onFailure" 并将异常响应信息吐出到警报或 div 中...

但在我看来,项目将来很可能会配置自定义错误页面来处理不同类型的异常,并根据首选设置这些页面的样式...

我不想仅仅因为我碰巧正在做部分视图 ajax 帖子就规避这个问题。

换句话说,我认为最好的办法是整个页面显示预期的错误页面。 但我不知道如何最好地处理这个问题?

我确实尝试通过将 jqXHR 写入文档来实现这一目标...

if (jqXHR.status !== 200) {
     // Replace the entire body content with the server response
     alert('replace error');
     document.open();
     document.write(jqXHR.responseText);
     document.close();
}

但是

jqXHR.responseText
似乎只是异常详细信息,而不是呈现错误页面的 html(请参阅实际与预期)。

实际:

enter image description here

预期:

enter image description here

我猜想,当执行标准的整页回发时,管道中的某个位置会返回一个重定向,该重定向在 ajax 调用期间不会被处理。

这让我相信我处理这个问题的方式不正确,无论是在控制器端点还是在 javascript 中?

jquery ajax asp.net-core-mvc .net-8.0
1个回答
0
投票

有很多不同的方法可以解决这个问题。如果您要开始一个新项目,我建议考虑更现代的前端堆栈,例如 React、Svelte 或 Angular。这些堆栈比 MVC/jQuery 模式更好地分离关注点,这将使处理错误情况变得更加简单:错误可以作为 JSON 响应的一部分返回,并且在前端运行的 UI 代码可以确定错误的方式应该渲染。

但如果这不是一个选择,我将分享我最终在过去的应用程序中采用的模式,该模式使用 MVC/jQuery 并利用不显眼的 javascript 模式。

我编写了该应用程序,因此所有 AJAX 端点都应返回包含事件数组的 JSON 有效负载,并且每个支持 AJAX 的操作都会简单地发出返回的所有事件。每个事件都有一个“类型”和一个有效负载,随着时间的推移,我发现事件变得更像命令,每个事件类型都有一个 UI 处理程序。

在正常的执行路径中,将返回一个事件,其“类型”类似于“ReplaceContent”——意味着用通常来自渲染部分视图的一些 HTML 替换 UI 的指定部分。每当以这种方式替换 HTML 时,UI 代码都会使用 jQuery 扫描更新的 HTML,以基于不显眼的 javascript 模式应用任何必要的处理程序或修改。如果 UI 的多个部分可能需要更新,服务器可能会返回多个事件。这种基于事件的方法足够灵活,可以进行高级交互,例如打开和关闭模式对话框等。

发生错误时,服务器端错误处理程序将返回一个事件,该事件知道如何向用户表示错误。这可能意味着在对话框或“toast”中显示事件详细信息。在开发环境中,我们可能会包含异常消息和堆栈跟踪等详细信息,而在生产环境中,我们可能只是说“发生了意外情况,我们无法完成此操作;如果这种情况持续发生,请联系代表寻求帮助” ”。大多数用户并不关心您的数据库查询超时,因为他们对此无能为力。

我无法说出构建应用程序的“最佳”方法是什么,但我发现这种架构允许我非常有效地重用 UI 代码和组件,并且具有足够的灵活性来优雅地处理非常复杂的交互,包括错误情况。

© www.soinside.com 2019 - 2024. All rights reserved.