You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Server+ASP.NET Core Web API更新方法失效求助

Blazor + ASP.NET Core Web API 更新功能故障排查

我是Blazor和ASP.NET Core Web API的新手,正在开发产品页面测试CRUD操作。创建、读取功能正常,但更新功能完全失效,试过多种方法都没用,目前收到400 Bad Request错误。

现有代码

控制器代码

[HttpPut("{id}")]
public async Task<IActionResult> PutTblProduct(string id, TblProduct tblProduct)
{
    if (id != tblProduct.ProductCode)
    {
        return BadRequest();
    }

    _context.Entry(tblProduct).State = EntityState.Modified;

    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!TblProductExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return NoContent();
}

接口IProduct.cs代码

public interface IProduct
{
    Task<IEnumerable<TblAgency>> getAgencies();
    Task<IEnumerable<TblCategory>> getCategories();
    Task<IEnumerable<TblProductType>> getProductTypes();
    Task<IEnumerable<TblProduct>> getProducts();
    Task<TblProduct> CreateProduct(TblProduct newProduct);
    Task UpdateProduct(string id, TblProduct upDateProduct);
    Task<TblProduct> GetProduct(string productCode);
}

Product.cs实现类代码

public async Task UpdateProduct(string id, TblProduct upDateProduct)
{
    var result = await httpClient.PutAsJsonAsync<TblProduct>("api/TblProducts/" + id, upDateProduct);
}

Product.razor组件代码

private async Task SubmitForm()
{
    newProdut.EnteredBy = "Admin";
    newProdut.BarCode = "0000000";

    if (SaveOption == false)
    {
        int response = Convert.ToInt32(await _product.CreateProduct(newProdut));
    }
    else
    {
        //await _product.UpdateProduct(newProdut, AppData.prCode);
        await _product.UpdateProduct(AppData.prCode, newProdut);
        SaveOption = false;
    }
}

修复建议

1. 验证ID与实体ProductCode一致性

控制器中id != tblProduct.ProductCode会直接返回400错误,需确认:

  • AppData.prCode(传入的ID)和newProdut.ProductCode是否完全一致
  • 更新操作中是否意外修改了newProdut.ProductCode的值

2. 增加HTTP请求错误检查

在UpdateProduct方法中添加响应校验,快速定位请求问题:

public async Task UpdateProduct(string id, TblProduct upDateProduct)
{
    var result = await httpClient.PutAsJsonAsync<TblProduct>("api/TblProducts/" + id, upDateProduct);
    // 若请求失败,直接抛出异常暴露错误信息
    result.EnsureSuccessStatusCode();
}

3. 优化实体更新逻辑

直接设置EntityState.Modified可能导致未预期的字段覆盖,建议先查询现有实体再更新指定属性:

[HttpPut("{id}")]
public async Task<IActionResult> PutTblProduct(string id, TblProduct tblProduct)
{
    if (id != tblProduct.ProductCode)
    {
        return BadRequest();
    }

    var existingProduct = await _context.TblProducts.FindAsync(id);
    if (existingProduct == null)
    {
        return NotFound();
    }

    // 仅更新需要修改的属性,根据实际业务调整
    existingProduct.ProductName = tblProduct.ProductName;
    existingProduct.CategoryCode = tblProduct.CategoryCode;
    existingProduct.ProductTypeCode = tblProduct.ProductTypeCode;
    existingProduct.EnteredBy = tblProduct.EnteredBy;
    existingProduct.BarCode = tblProduct.BarCode;

    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!TblProductExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return NoContent();
}

4. 调试参数传递正确性

在Blazor组件的SubmitForm方法中添加日志,确认参数值:

else
{
    Console.WriteLine($"更新ID: {AppData.prCode}, 实体ProductCode: {newProdut.ProductCode}");
    await _product.UpdateProduct(AppData.prCode, newProdut);
    SaveOption = false;
}

内容的提问来源于stack exchange,提问作者Muhammad Yaseen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:53:18