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
相关产品推荐
相关产品推荐

