我正在开发 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 确保在每个导航上加载数据,但问题仍然存在。
根据您提供的内容,您的问题是您正在 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 以查找大量材料和教程。