【发布时间】:2021-11-10 02:51:01
【问题描述】:
这是我的用例。我有一个持有全局站点状态的单例对象。我的网站上有一个按钮,单击该按钮会在全局站点状态对象上触发一个事件。我有一个正在侦听此事件的 Blazor 组件(剃刀)。它通过这样做来响应事件
var path = "siteupdate".AddInitialQueryStringArg("returnUrl", _navManager.Uri);
_navManager.NavigateTo(path,true);
这个想法是将所有在线用户重定向到 Razor 页面 (.cshtml),其中显示“网站正在更新,稍后再回来”的消息。当服务器因更新而暂时停机并失去与 SignalR 集线器的连接时,这是提供良好用户体验的必要条件。
在执行之后,它看起来好像导航器试图导航到 siteupdate 页面,但它最终被拒绝并重置回我拨打电话时所在的任何组件。类似于您尝试手动更新浏览器中的 url 并且 navmanager 将其重置。在我的 Razor 页面中放置断点我可以看出 OnGet 方法大部分时间都会被调用,但它的响应似乎不是被确认或什么?我尝试了以下方法:
尝试通过 javascript 设置窗口位置
var path = "/update".AddInitialQueryStringArg("returnUrl", _navManager.Uri);
JSRuntime.InvokeVoidAsync("BlazorHelpers.RedirectTo", path);
尝试不使用强制重新加载,这会导致 404
var path = "/siteupdate".AddInitialQueryStringArg("returnUrl", _navManager.Uri);
_navManager.NavigateTo(path);
作为参考,我在下面有 Razor 页面
Pages/SiteUpdate/UpdateLandingPage.cshtml
我尝试将它放在 Pages 文件夹下,但正如我之前所说,OnGet 方法被调用,因此路由器似乎正在找到它,但似乎框架以某种方式覆盖了 URL。
谢谢
【问题讨论】:
-
您可以从新的浏览器窗口访问站点更新页面吗?如果没有,请检查您的路由/端点配置
-
好问题,是的,如果我打开一个新标签并手动输入地址,它就可以正常工作。
-
您是否在浏览器开发工具网络选项卡中监控了浏览器请求 - 查看正在发生的请求/响应?
-
我得到一个奇怪的“被阻止”或在重新加载前一页时立即消失的东西。我认为@Quarango 在 blazor 组件(.razor)和 razor 页面(.cshtml)之间的导航在这种情况下有点复杂。
-
您可以在浏览器开发工具中勾选一个框以保留历史记录(在 Edge 中称为“保留日志”),这样您就不会丢失捕获的请求 - 您需要查看发生了什么 - 这听起来像siteupdate 页面正在立即重定向,但您可以通过捕获响应来确认
标签: asp.net-core blazor razor-pages blazor-server-side