Blazor:在页面导航上重新加载数据 - 未保存的更改可见

问题描述 投票:0回答:1

我正在开发 Blazor 项目,遇到一个问题:对编辑页面上的数据所做的更改即使尚未保存,也可见。当用户导航回主页时,这些更改仍然会显示,即使它们没有保存在数据库中。

页面概览:

主页(显示客户列表):

@page“/客户” @注入客户服务客户服务

客户名单

@code {
    private List<Customer> customers;

    protected override async Task OnInitializedAsync()
    {
        await JS.InvokeVoidAsync("startProgressBar");
        await LoadDataAsync();
        StateHasChanged();
    }



protected override async void OnAfterRender(bool firstRender)
{
    base.OnAfterRender(firstRender);

    if(firstRender)
    {
        Customer= await Kundenservice.GettAllKundenAsync();
    }

    StateHasChanged();
}
}

详细信息页面(显示个人客户详细信息):

@page "/CustomerDetails/{id:int}"
@inject CustomerService customerService

<PageTitle>Customer Details</PageTitle>

@code {
    [Parameter] public int Id { get; set; }
    private Customer customer;

    protected override async Task OnParametersSetAsync()
    {
        await LoadDataAsync();
    }

    private async Task LoadDataAsync()
    {
        customer = await customerService.GetCustomerByIdAsync(Id);

    }
}

编辑页面(编辑客户详细信息):

@page "/EditCustomer/{id:int}"
@inject CustomerService customerService

<PageTitle>Edit Customer</PageTitle>

@code {
    [Parameter] public int Id { get; set; }
    private Customer customer;

    protected override async Task OnParametersSetAsync()
    {
        await LoadDataAsync();
    }

    private async Task LoadDataAsync()
    {
        customer = await customerService.GetCustomerByIdAsync(Id);
    }

    private async Task SaveChanges()
    {
        await customerService.UpdateCustomerAsync(customer);
        NavigationManager.NavigateTo($"/CustomerDetails/{customer.Id}");
    }
}

问题:

当用户在编辑页面上编辑客户详细信息并导航回主页而不保存时,即使更改未保存在数据库中,更改仍会在主页上可见。 期望的行为:

我希望每次导航到页面时都从数据库重新加载数据,确保任何未保存的更改不可见。

问题:

如何确保每次导航到页面时都从数据库重新加载数据,从而防止显示未保存的更改? Blazor 中是否有更好的方法来处理这种情况?

我尝试通过在页面中使用 OnInitializedAsync 和 OnParametersSetAsync 确保在每个导航上加载数据,但问题仍然存在。

c# navigation blazor
1个回答
0
投票

根据您提供的内容,您的问题是您正在 DbContext 中编辑实时数据。 当您退出表单时,您的编辑将保留在 DbContext 保存的数据集中。

解决方案是使用 HttpContext Factory 并在事务基础上使用它提供的 DbContext。 获取项目列表是一个打开、获取数据然后关闭 Dbcontext 的事务。 获取物品或保存物品也是如此。

提供工作示例超出了 SO 答案的范围。

您应该查看 MS 文档 - https://learn.microsoft.com/en-us/aspnet/core/blazor/blazor-ef-core?view=aspnetcore-8.0

并在互联网上搜索 blazor dbcontextfactory 以查找大量材料和教程。

© www.soinside.com 2019 - 2024. All rights reserved.