怪奇物语

怪奇物语

首页 新随笔 联系 管理

Blazor razor 注释参数 SupplyParameterFromQuery SupplyParameterFromForm OnInitializedAsync

参数属性

[SupplyParameterFromQuery]
public int Id { get; set; }

[SupplyParameterFromForm]
public Movie? Movie { get; set; }
  • [SupplyParameterFromQuery]:这个特性表明Id参数是从查询字符串中获取的。例如,在URL https://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");
}
  1. 更新实体状态

    • DB.Attach(Movie!).State = EntityState.Modified;:这行代码的目的是将Movie实体的状态设置为Modified
      在Entity Framework中,实体具有不同的状态(如DetachedUnchangedAddedDeletedModified),这些状态决定了实体在数据库中的操作。
      通过将Movie实体的状态设置为Modified,表示该实体已经被修改,当调用SaveChangesAsync方法时,Entity Framework会生成相应的SQL语句来更新数据库中的对应记录。
  2. 处理并发冲突

    • 如果在保存更改时发生DbUpdateConcurrencyException异常(通常在多个用户同时尝试更新同一记录时可能发生),代码会进入异常处理块。
    • 在异常处理块中,首先检查通过MovieExists(Movie!.Id)方法判断数据库中是否还存在具有相同Id的电影记录。
      如果不存在,同样需要处理404错误的情况(这里的注释提到了一个已知问题,即目前还没有直接的方法来触发404错误)。
      如果存在,则重新抛出异常,以便在更高层次进行处理。
posted on 2024-11-27 08:00  超级无敌美少男战士  阅读(71)  评论(0)    收藏  举报