【发布时间】:2021-12-01 02:16:32
【问题描述】:
我正在尝试使用布局中的 CascadingParameter 以通用方式管理我的网站的“加载”。
但是,在我调用“onclick”加载之后,我无法从“继承页面”EditForm 的“OnValidSubmit”函数中停止“加载”。
让我告诉你。
在我的 MainLayout 中,我设法显示加载 h2 或页面内容,无论它是什么:
<CascadingValue Value="this">
@if (load == true)
{
<h2>Loading...</h2>
} else
{
@Body
}
</CascadingValue>
@code
{
public bool load = false;
//---------------------------
// Setters
public void Loading()
{
load = true;
}
public void StopLoading()
{
load = false;
}
}
在从该 MainLayout 继承的其他页面中,我有一个 EditForm,它将检查用户名和密码是否与数据库匹配。
如果没有错误,它应该调用“加载”函数,然后在数据库中处理搜索,然后导航到主页。
所以我将“加载”功能添加到我的 EditForm 的“onclick”中,当我点击按钮时它会正确显示加载 h2:
<EditForm Model="@user" OnValidSubmit="@TriggerLogin">
<InputText id="name" placeholder="Email" @bind-Value="user.Username" inputmode="email" />
<InputText id="password" placeholder="Mot de passe" @bind-Value="user.Password" type="password" inputmode="text" />
<button class="button-pink" type="submit" @onclick="Layout.Loading">Se connecter</button>
</EditForm>
然后使用我的“OnValidSubmit”函数对数据库进行研究:
private async Task TriggerLogin()
{
if (members.Login(user) == true)
{
// Do stuff with accesstoken
Layout.StopLoading();
NavigationManager.NavigateTo("/commandes");
}
else
{
Layout.StopLoading();
error = "Wrong password or username";
}
}
但是我的 StopLoading() 函数没有更新我的页面!
即使我的调试器说我在布局中正确输入了函数,布局也没有输入 html 部分的“else”,也没有显示“@Body”。
我尝试在布局中使用 this.StateHasChanged()(它唯一起作用的地方),但我正在寻找另一种解决方案,因为它不会显示错误消息。
如何强制仅布局刷新 html 部分? 谢谢
【问题讨论】:
-
error变量是什么?你如何呈现它? -
@HenriquePombo 是继承MainLayout的页面中的局部变量。所以
private string error -
老实说,这是一种试图实现目标的非常混乱的方式。我把它归咎于微软的 ITab 示例。你不需要传递任何东西。将加载部分移动到表单组件本身并在那里管理进度。
-
仅在
OnValidSubmit之后调用body 对我来说没有多大意义。您登录的地方是否有其他布局?在布局上显示正文后显示错误,它不会出现是有道理的。你有没有想过使用Toast -
您似乎在每个页面上手动执行授权检查。您应该简单地使用 [Authorize] 属性。对于任何其他类型的“通用”加载,您应该将加载相关逻辑放在需要耗时加载的组件中。