如何在登录Blazor服务器应用程序时显示加载图标



我有一个Blazor服务器应用程序(很棒(,它有一个Razor页面登录表单(非常痛苦(。

提交登录表单后,在PageModel类中,我有一个OnPostAsync方法,该方法调用我的API登录并获取auth令牌,但显然存在延迟因素(目前我的情况很糟糕(。事实上,我的页面在按下登录后几乎没有显示它正在做任何事情,当联系API时,页面就在那里,就像提交按钮还没有按下一样,这对用户来说显然非常糟糕,因为他们要做的第一件事是将提交按钮混合在一起,直到他们得到视觉响应(公平地说,我可能会这样做(。

我到底是如何在Razor页面中做到这一点的?我试过这个和这个,都不起作用。目前我并不特别在乎表演或做了什么,我只想让它做点什么。对我来说,完美的解决方案是禁用表单和/或覆盖某些内容以显示它很忙,但我会采取基本的";正在加载"消息。

有办法做到这一点吗?

似乎根本不可能在Blazor服务器应用程序中使用Razor页面,因为没有什么可以更新UI,它不像Blazor组件那样在服务器和客户端之间保持SignalR连接。在登录页面的情况下,页面被提供给客户端,然后连接被切断,因此发生的下一个操作是页面将其持有的详细信息提交给服务器,并期望登录结果作为响应。

Javascript本应该起作用,但我不知道为什么它没有起作用,我添加了一个脚本来在提交表单时更改一些UI元素,但似乎首先调用了PageModel中的OnPostAsync方法,无论脚本是否在运行,它都没有更新UI,我猜是因为它在做任何事情之前都在等待响应。另一种选择是从PageModel中删除登录代码,转而使用AJAX调用,但我并不真的想这么做。

我添加了一个ILoginHandlerService,其中包含StoreLoginRetrieveLogin。在实现中,它接收一个包含凭据的登录对象,对其进行加密并将其存储在专用变量中。此服务作为单例添加到应用程序启动类中。登录页面现在用提交的详细信息调用StoreLogin方法;登录";页这个新页面有一个";形式";其中只有一个文本元素,包含一条请等待消息,以及一个在加载时在表单上调用Post的脚本。

";登录";页面的OnPostAsync是实际执行登录的内容。它调用注入的IAuthService登录,而不向其传递任何详细信息。IAuthService实现本身(作为应用程序启动中的作用域服务添加(被注入ILoginHandlerService,然后在内部调用该服务以提供存储的登录对象。存储的对象被解密、置空并返回到IAuthService,然后被提交到我的API,然后该API用logged-in用户令牌进行响应,该用户令牌被返回到;登录";页面,然后调用HttpContext.SignInAsync,添加接收到的API令牌,并将用户重定向到主页,登录。

这对我来说似乎很复杂,我不完全确定它是正确的。根据我对以上内容的理解,一旦从登录表单提交了凭据,所有未来对凭据的处理现在都应该在服务器端完成,并且永远不会返回到客户端?

相关内容

  • 没有找到相关文章

最新更新