C# 将条目添加到数据库后Blazor组件未刷新
我正在开发一个简单的应用程序来管理Blazor服务器端的酒店预订,使用EF Core作为数据库。我有一个酒店房间的添加表单,在同一个页面上我显示了所有房间的列表,我目前面临一个问题,当我添加一个新房间时,组件本身没有刷新,我必须单击F5以再次填充我的列表。我在youtube上发现了这个,他也在做类似的事情,这对他来说很有用。我也试着在我的页面代码中加入statehaschange,但什么也没发生 这是页面代码:C# 将条目添加到数据库后Blazor组件未刷新,c#,entity-framework,asp.net-core,blazor,blazor-server-side,C#,Entity Framework,Asp.net Core,Blazor,Blazor Server Side,我正在开发一个简单的应用程序来管理Blazor服务器端的酒店预订,使用EF Core作为数据库。我有一个酒店房间的添加表单,在同一个页面上我显示了所有房间的列表,我目前面临一个问题,当我添加一个新房间时,组件本身没有刷新,我必须单击F5以再次填充我的列表。我在youtube上发现了这个,他也在做类似的事情,这对他来说很有用。我也试着在我的页面代码中加入statehaschange,但什么也没发生 这是页面代码: @page "/rooms" @using HotelServi
@page "/rooms"
@using HotelServiceSystem.Interfaces.Services
@using HotelServiceSystem.Entities
@inject IRoomService roomService
<h3>Rooms</h3>
<div class="col-12">
<hr/>
<EditForm Model="@ModelRoom" OnSubmit="@SaveRoom">
<div class="col-12 row">
<label class="col-2">Room number</label>
<InputText class="form-control col-3" @bind-Value="ModelRoom.RoomIdentifier"/>
</div>
<br />
<div class="col-12 row">
<label class="col-2">Floor</label>
<InputNumber class="form-control col-3" @bind-Value="ModelRoom.Floor"/>
</div>
<br />
<div class="col-12 row">
<label class="col-2">Number of beds</label>
<InputNumber class="form-control col-3" @bind-Value="ModelRoom.NumberOfBeds"/>
</div>
<br />
<div class="col-12 row">
<span class="col-2"></span>
<input type="submit" class="form-control col-1 btn btn-primary" value="Submit"/>
<span> </span>
<input type="submit" class="form-control col-1 btn btn-primary" value="Clear"/>
</div>
</EditForm>
<div class="col-10">
<h3>Rooms</h3>
<table class="table">
<thead>
<tr>
<th>Room number</th>
<th>Capacity</th>
<th>Number of beds</th>
<th>Floor</th>
<th>Price</th>
<th>Is free?</th>
<th>Is out of service?</th>
<th>Need cleaning?</th>
</tr>
</thead>
<tbody>
@if (RoomList != null)
{
foreach (var room in RoomList)
{
<tr>
<td>@room.RoomIdentifier</td>
<td>@room.GuestsCapacity</td>
<td>@room.NumberOfBeds</td>
<td>@room.Floor</td>
<td>@room.Price</td>
<td>@room.IsFree</td>
<td>@room.IsOutOfService</td>
<td>@room.ShouldBeCleaned</td>
</tr>
}
}
else
{
<h3>..Loading</h3>
}
</tbody>
</table>
</div>
</div>
@code {
private List<Room> RoomList { get; set; }
private Room ModelRoom { get; set; }
protected override async Task OnInitializedAsync()
{
ModelRoom = new Room();
RoomList = roomService.GetAllRoomsAsync();
await base.OnInitializedAsync();
}
private async void SaveRoom()
{
ModelRoom.RoomReservations = new List<RoomReservation>();
ModelRoom.IsFree = true;
ModelRoom.IsOutOfService = false;
ModelRoom.ShouldBeCleaned = false;
await roomService.AddRoomAsync(ModelRoom);
ModelRoom = new Room();
}
}
@page”/rooms
@使用HotelServiceSystem.Interfaces.Services
@使用HotelServiceSystem.Entities
@注入IRoomService roomService
房间
房间号
地板
病床数
房间
房间号
容量
病床数
地板
价格
是免费的吗?
它停止服务了吗?
需要清洗吗?
@if(RoomList!=null)
{
foreach(房间列表中的var房间)
{
@房间标识符
@客房容量
@房间,床数
@房间,地板
@房间,价格
@房间是免费的
@房间自动服务
@应该打扫房间吗
}
}
其他的
{
…装载
}
@代码{
私有列表RoomList{get;set;}
私人房间模型室{get;set;}
受保护的重写异步任务OnInitializedAsync()
{
模型室=新房间();
RoomList=roomService.GetAllRoomsAsync();
wait base.OnInitializedAsync();
}
专用异步void存储室()
{
ModelRoom.RoomReservations=新列表();
ModelRoom.IsFree=true;
ModelRoom.IsOutOfService=false;
ModelRoom.shouldbeclean=false;
等待roomService.AddRoomAsync(ModelRoom);
模型室=新房间();
}
}
感谢您的帮助,我已经寻找了大约几个小时的解决方案您应该使用
OnValidSubmit=“@SaveRoom”
而不是OnSubmit=“@SaveRoom”
SaveRoom
方法的返回类型应该是Task
,而不是void
,如下所示
private async Task SaveRoom()
{
}
为什么使用2个“提交”按钮?删除第二个…您忘记更新
RoomList
,如下所示:等待roomService.AddRoomAsync(ModelRoom);房间列表。添加(模型室);StateHasChanged()代码>是的,我可以看到,但视频上的家伙也没有这样做,它可能来自数据库,或者不是?它现在可以工作,但我有一个奇怪的问题,如果我保存数据的方法是在这种情况下的存储空间,它是异步的,我必须点击提交2次来保存它,有人知道为什么吗?