Blazor razor 注释参数 SupplyParameterFromQuery SupplyParameterFromForm OnInitializedAsync
参数属性:
[SupplyParameterFromQuery]
public int Id { get; set; }
[SupplyParameterFromForm]
public Movie? Movie { get; set; }
[SupplyParameterFromQuery]:这个特性表明Id参数是从查询字符串中获取的。例如,在URLhttps://example.com/movies/edit?id=123中,123就是通过查询字符串传递给组件的Id值。[SupplyParameterFromForm]:这个特性表明Movie参数是从表单提交中获取的。当用户在表单中填写电影信息并提交时,Blazor会将表单数据绑定到Movie对象。
OnInitializedAsync方法:
protected override async Task OnInitializedAsync()
{
Movie ??= await DB.Movie.FirstOrDefaultAsync(m => m.Id == Id);
if (Movie is null)
{
// Need a way to trigger a 404 here
}
}
- 这是一个生命周期方法,在组件初始化时被调用。它用于获取要编辑的电影数据。
- 首先,通过
DB.Movie.FirstOrDefaultAsync方法从数据库中获取Id对应的电影数据,并将结果赋值给Movie属性。如果数据库中不存在对应的电影数据,Movie将为null。 - 然后,检查
Movie是否为null。如果是null,则表示没有找到对应的电影数据,需要触发一个404错误。
更新电影数据的异步方法UpdateMovie
public async Task UpdateMovie()
{
DB.Attach(Movie!).State = EntityState.Modified;
try
{
await DB.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(Movie!.Id))
{
// Need a way to trigger a 404 here
}
else
{
throw;
}
}
NavigationManager.NavigateTo("/movies");
}
-
更新实体状态:
DB.Attach(Movie!).State = EntityState.Modified;:这行代码的目的是将Movie实体的状态设置为Modified。
在Entity Framework中,实体具有不同的状态(如Detached、Unchanged、Added、Deleted、Modified),这些状态决定了实体在数据库中的操作。
通过将Movie实体的状态设置为Modified,表示该实体已经被修改,当调用SaveChangesAsync方法时,Entity Framework会生成相应的SQL语句来更新数据库中的对应记录。
-
处理并发冲突:
- 如果在保存更改时发生
DbUpdateConcurrencyException异常(通常在多个用户同时尝试更新同一记录时可能发生),代码会进入异常处理块。 - 在异常处理块中,首先检查通过
MovieExists(Movie!.Id)方法判断数据库中是否还存在具有相同Id的电影记录。
如果不存在,同样需要处理404错误的情况(这里的注释提到了一个已知问题,即目前还没有直接的方法来触发404错误)。
如果存在,则重新抛出异常,以便在更高层次进行处理。
- 如果在保存更改时发生
浙公网安备 33010602011771号