C# 成功更新数据库后Blazor服务器页面未刷新

C# 成功更新数据库后Blazor服务器页面未刷新,c#,blazor,blazor-server-side,C#,Blazor,Blazor Server Side,我的问题可能很简单,但我一直在周而复始地试图理解问题是什么。我有一个Blazor页面,其中包含加载数据的单独模型类(引用为列表的LsC,或者在代码中循环时引用为single的ls)。但是,当我单击以更新该数据时,页面不会刷新。如果我添加一个新条目,该页面将加载新条目 出现问题的Blazor页面代码很简单: @if (ls.PrimaryContact) { <div style="cursor: pointer;" class="badge badge

我的问题可能很简单,但我一直在周而复始地试图理解问题是什么。我有一个Blazor页面,其中包含加载数据的单独模型类(引用为
列表的LsC,或者在代码中循环时引用为single的ls)。但是,当我单击以更新该数据时,页面不会刷新。如果我添加一个新条目,该页面将加载新条目

出现问题的Blazor页面代码很简单:

@if (ls.PrimaryContact)
{
    <div style="cursor: pointer;" class="badge badge-pill badge-success">Primary</div>
}
else
{
    <div style="cursor: pointer;" @onclick="@(() =>MakePrimaryContact(@ls.Id))" class="badge badge-pill badge-info">Make Primary</div>
}
我添加了
statehaschange()
作为额外的度量,但是我的页面没有获取具有正确主要联系人的更新记录集。直到我手动(F5)刷新网页,才反映出正确的更新

奇怪的是,在同一个页面上,我还有一个按钮,可以添加一个新的数据库条目,并自动弹出更新

不存在问题的新数据库条目的代码:

+新建


如果您有任何建议,我们将不胜感激。

我猜您是在OnInitialized()方法上调用Database方法

您可以使用StateHasChanged()进行同样的尝试吗您可以在这里找到文档

否则,唯一的解决方案是更改要在UI中绑定的项的值,该值在代码中:

@if (ls.PrimaryContact)
{
    <div style="cursor: pointer;" class="badge badge-pill badge-success">Primary</div>
}
else
{
    <div style="cursor: pointer;" @onclick="@(() =>MakePrimaryContact(@ls.Id))" class="badge badge-pill badge-info">Make Primary</div>
}
然后

当您调用组件时

<MyComponent YourParam ="@Data"></MyComponent>

我非常感谢你的投入,因为这不会让我得到答案。当我进一步研究并从您的所有答案中了解到更多信息时,我发现这个问题的关键不仅在于更新UI和数据库,还在于需要刷新数据库集并在记录集上重新填充数据。我添加了简单的一行
LsC=LsCGw.GetByLeadsId(Id)。全部功能如下:

private async Task MakePrimaryContact(int LCId)
    {
        bool isConfirmed = await js.InvokeAsync<bool>("confirm", "Please confirm you want to make Primary?");
        if (isConfirmed)
        {
            LsCGw.UpdatePrimary(Ls.Id, LCId);
            LsC = LsCGw.GetByLeadsId(Id);
            StateHasChanged();
            OnInitialized();
        }
    }
专用异步任务MakePrimaryContact(int LCId)
{
bool isConfirmed=wait js.InvokeAsync(“确认”,“请确认您要进行主控?”);
如果(未确认)
{
LsCGw.UpdatePrimary(Ls.Id,LCId);
LsC=LsCGw.GetByLeadsId(Id);
StateHasChanged();
初始化();
}
}
有人会说我需要删除OnInitialized(),但当我这样做时,它不适用于StateHasChanged()。一切照旧,它确实有效。为使潜在客户返回到记录集中而添加的行实际上刷新了所有数据以使UI正确刷新


再次感谢。

不要调用OnInitialized yourself,这是一种只有Blazor才应该调用的生命周期方法。我认为你的问题在于你的方法实际上没有更新
ls
Lead
谢谢@peter。如果我不调用OnInitialized,就像我在以模式插入记录后所做的那样,页面不会刷新。在模态代码上,我添加了初始化以更新记录并显示;但是,当我在这个简单的录制updae上执行相同操作时,页面不会反映应该在“ls”上进行的更改。@Mariano如果
OnInitialized
做了一些您想在其他地方重复使用的工作,请将其移动到单独的方法,并从这两个方法中调用该方法@彼得的建议是正确的good@Quango谢谢我将尝试只使用一个调用OnInitialized的方法。Peter,谢谢,我还在想Blazor是如何一起工作的,我决不会取消一个建议。谢谢@Mangesh Gaherwar,我确实在用有问题的代码调用的函数上添加了statehaschange()。奇怪的是,当我在数据库中添加一条记录并取消模式时,我只调用onInitialized(),新记录会自动刷新显示在页面上的内容。onInitialized()重新呈现您的组件,使其成为数据库调用,它将刷新组件,否则您将需要检查操作状态并根据传输修改绑定模型。如果在模式上添加记录,我不需要担心绑定。我所做的就是更新数据库中的记录。因为它已经绑定,所以它应该反映OnInitialized()上的更改,还是不?我理解正确吗?非常感谢您的回复。是ls是模型中的参考类型。我没有把整个代码,因为它是相当广泛的。只需说ls来自一个循环,该循环从“List LsC=new List();”获取每个单独的“ls”这里的主要问题是整个循环工作得非常好。当我单击Make Primary按钮时,数据库确实更改了Primary字段,但当我调用StateHasChanged()或OnInitialized()时,页面不会刷新。此方法是事件,因此它们在事件之后工作;在我的代码AllCourseMaster from db中,当我更改数据库中的数据时,视图发生了更改;页面不刷新。İ如果您想重新加载,请访问此;谢谢你提到另一篇文章。我看到了相似之处。实际上,页面刷新(f5)是它实际刷新已更新数据的唯一方式。我感到奇怪的是,Blazor组件页面仅在向数据库添加记录时自动刷新,而在更新时不会自动刷新。我还没有找到一个明确的答案。由于我使用自定义选项卡页面组件,此选项对我来说不是可行的解决方案,因为它会将页面重新加载回主体或第一个选项卡。
@if (ls.PrimaryContact)
{
    <div style="cursor: pointer;" class="badge badge-pill badge-success">Primary</div>
}
else
{
    <div style="cursor: pointer;" @onclick="@(() =>MakePrimaryContact(@ls.Id))" class="badge badge-pill badge-info">Make Primary</div>
}
[Parameter] 
public YourModel YourParam { get; set; }
<MyComponent YourParam ="@Data"></MyComponent>
@foreach (var item in AllCourseMaster){
     @if(item.Active){
       <div id="first"></div>
      }
     else
     {
      <div id="second"></div>  
     }
}
<button @onclick="@(e=>CollapseClick(item.Id))"></button>
@code{
   void CollapseClick(int id)
    {
        var changed=AllCourseMaster.FirstOrDefault(x=>x.Id==id);
        changed.Active= !changed.Active;
    }
}
private async Task MakePrimaryContact(int LCId)
    {
        bool isConfirmed = await js.InvokeAsync<bool>("confirm", "Please confirm you want to make Primary?");
        if (isConfirmed)
        {
            LsCGw.UpdatePrimary(Ls.Id, LCId);
            LsC = LsCGw.GetByLeadsId(Id);
            StateHasChanged();
            OnInitialized();
        }
    }