asp.net 从Web API返回ok()后,代码无法继续

jm81lzqq  于 2023-04-22  发布在  .NET
关注(0)|答案(1)|浏览(186)

你好,我正在构建一个简单的程序,只是为了学习asp webapi和blazor,我的post函数工作正常,它在postman上进行了测试,下面是我的代码供您观察:

[HttpPost]
        [Route("addSingleProduct")]
        public IActionResult Post([FromBody] ProductModel product)
        {
            try
            {
                if (product == null)
                {
                    return BadRequest();
                }
                if (product != null)
                {
                    _conn.Open();
                    string query = "INSERT INTO Product VALUES (@ProdName, @ProdPrice,@ProdDesc,@ProdImg,@CatgId,@ProdFam)";
                    using (Def.cmd = new SqlCommand(query,_conn))
                    {
                        Def.cmd.Parameters.AddWithValue("@ProdName", product.ProdName);
                        Def.cmd.Parameters.AddWithValue("@ProdPrice", product.ProdPrice);
                        Def.cmd.Parameters.AddWithValue("@ProdDesc", product.ProdDesc);
                        Def.cmd.Parameters.AddWithValue("@ProdImg", product.ProdImg);
                        Def.cmd.Parameters.AddWithValue("@CatgId", product.CatgId);
                        Def.cmd.Parameters.AddWithValue("@ProdFam", product.ProdFam);

                        //Def.cmd.ExecuteNonQuery();
                        int rowsAffected = Def.cmd.ExecuteNonQuery();
                        if (rowsAffected == 0)
                        {
                            _conn.Close();
                            return StatusCode(StatusCodes.Status500InternalServerError, "Failed to insert product");
                        }
                    }
                    _conn.Close();                   
                }
                return Ok();
            }
            catch(Exception ex)
            {
                _conn.Close();
                Console.WriteLine(ex.Message);
                return StatusCode(StatusCodes.Status500InternalServerError, "Failed to insert product");
            }
        }

在我的Blazor应用程序中,我正在等待响应,以便将值放置在布尔值中,以便我可以向用户显示产品已添加

@if(isadded==true){
    <h1>Product was added</h1>
}else{
    <h1>Product was not added</h1>
}

@code {
    private bool isadded;
    [Inject]
    private GetProductsService productService { get; set; }

    private ProductModel product = new ProductModel();

    protected async Task<bool> AddNewProduct()
    {
        try
        {
            HttpResponseMessage response = await productService.AddProduct(product);
            if (response.IsSuccessStatusCode)
            {
                isadded = true;
            }
            else
            {
                string responseContent = await response.Content.ReadAsStringAsync();
                Console.WriteLine($"AddProduct failed with status code {response.StatusCode}: {responseContent}");
                isadded  = false;
            }
            return isadded;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return false;
        }
    }
}

这里是我的服务,我在这里进行API调用

public async Task<HttpResponseMessage> AddProduct(ProductModel product)
        {
            return await _httpClient.PostAsJsonAsync("api/Product/AddSingleProduct", product);          
        }

代码运行平稳,模型被发送到API并插入数据库,但当它点击return ok()时,什么也没有发生,调试停止,所以我无法告诉用户产品已添加

yvgpqqbh

yvgpqqbh1#

问题似乎在于Blazor组件中的isadded布尔值没有正确更新。
在你的代码中,你异步调用AddNewProduct()方法,但是你在调用它的时候并没有等待结果。这意味着在代码执行的时候isadded的值可能没有更新,导致它总是显示“Product was not added”。
要解决这个问题,您应该在调用AddNewProduct()方法时等待它:

protected async Task AddNewProduct()
{
    isadded = await productService.AddProduct(product);

    StateHasChanged();
}

GetProductsService类中,您应该修改AddProduct()方法以返回bool值而不是HttpResponseMessage:

public async Task<bool> AddProduct(ProductModel product)
{
    HttpResponseMessage response = await _httpClient.PostAsJsonAsync("api/Product/AddSingleProduct", product);          
    return response.IsSuccessStatusCode;
}

通过这样做,您将返回一个布尔值,指示产品是否已添加。
然后,在Blazor组件中,您可以更新AddNewProduct()方法以使用返回的布尔值:

protected async Task AddNewProduct()
{
    isadded = await productService.AddProduct(product);

    StateHasChanged();
}

通过这些更改,isadded值应正确更新,并且UI应根据是否添加了产品显示正确的消息。

相关问题