您不应该使用表单元素,也不应该提交表单。
幸运的是,据我所知,内部blazor代码应该使用preventdefault()停止提交;
在任何情况下,可能在回发发生后调用loginasync。考虑一下:一方面,您的代码启动一个“回发”,另一方面,它向服务器发出一个HTTP请求。简而言之,您应该使用httpclient发布表单数据。
表格数据:
<div>
<input type="email" placeholder="Email Address" bind="@LoginViewModel.Email" />
<input type="password" placeholder="Password" bind="@LoginViewModel.Password" />
<button type="button">Login</button>
</div>
注意,按钮的类型属性应该设置为“button”。现在,只要您点击按钮,就会调用loginasync方法,从中您将登录数据发布到服务器。
尝试以下操作:
将这些代码段添加到您的登录服务中:
[Inject]
protected LocalStorage localStorage;
// Note: LocalStorage is a library for storing data in Web Storage API. You may store your token in the LocalStorage, and retrieve it when you need to verify whether a user is authenticated.
// This method may be called from your NavMenu Component
public bool IsAuthenticated()
{
var token = localStorage.GetItem<string>("token");
return (token != null);
}
public async Task<bool> LoginAsync(LoginViewModel model)
{
try
{
var response = await _http.PostJsonAsync<TokenResult>("/api/auth", model);
Token = response.Token;
if (Token)
{
// Save the JWT token in the LocalStorage
// https://github.com/BlazorExtensions/Storage
await localStorage.SetItem<Object>("token", Token);
// Returns true to indicate the user has been logged // in and the JWT token is saved on the user browser
return true;
}
}
catch (Exception)
{
return false;
}
}
最后是navmenu.cshtml:
@inject ILoginService LoginService
@if(LoginService.IsAuthenticated()) {
<a href="logout">Logout</a>
}
else {
<a href="login">Login</a>
}
//您还必须在客户机上设置如下启动类:
public void ConfigureServices(IServiceCollection services)
{
// Add Blazor.Extensions.Storage
// Both SessionStorage and LocalStorage are registered
// https://github.com/BlazorExtensions/Storage
**services.AddStorage();**
...
}
//一般来说,这是您在客户机上要做的事情。//在服务器上,你必须有一个方法,比如在帐户控制器中,它的功能是生成JWT令牌,你必须配置JWT中间件,用必要的属性来注释你的控制器,例如:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
希望这有帮助…