【问题标题】:ASP.NET Web api 2- delete from arrayASP.NET Web api 2- 从数组中删除
【发布时间】:2018-05-22 06:10:36
【问题描述】:

我正在使用 ASP.NET Web api 2 构建我的第一个应用程序,只是为了教育目的。我想将数据存储在 Array 中(我知道,在 DB 中会更好)。 我写了几个 get 方法,它们工作正常,但我不知道为什么 DELETE 没有像我预期的那样工作。

我想从数组中删除具有提供 ID 的 Car。运行操作后,它显示具有特定 ID 的汽车已被删除,但是当我运行显示阵列中所有汽车的操作时,汽车似乎仍然存在。

请在下面找到控制器的代码。谁知道是什么原因?

using System; 
using Cars.Models;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace Cars.Controllers
{
    public class carsController : ApiController
    {
        List<Car> cars = new List<Car>(new Car[]
        {
            new Car { Id = 1, Name = "Opel", Price = 49999.9 },
            new Car { Id = 2, Name = "Fiat",  Price = 30000.0 },
            new Car { Id = 3, Name = "BMW",  Price = 100500.9 }
        });

        public HttpResponseMessage GetAllCars()
        {
            return Request.CreateResponse(HttpStatusCode.OK, cars);
        }


        [HttpDelete]
        [Route("api/cars/deletecar/{id}")]
        public IHttpActionResult DeleteCar(int id)
        {
           var car = cars.FirstOrDefault((p) => p.Id == id);
            if(car!=null)
            {
                for(int i=0;i<=cars.Count;i++)
                {
                    if (cars[i].Id==id)
                    {
                        cars.RemoveAt(i);

                       return Ok(cars );
                    }
                }

            }
            return NotFound();
        }
    }

【问题讨论】:

  • 在实现programtreasures的逻辑后,在得到car对象后使用cars.Remove(car),而不是循环遍历cars list

标签: c# asp.net asp.net-web-api web controller


【解决方案1】:

因为您的 cars 列表实例会为每个请求创建,

你应该把它设为静态属性并尝试一下

     static List<Car> cars = new List<Car>(new Car[]
    {
        new Car { Id = 1, Name = "Opel", Price = 49999.9 },
        new Car { Id = 2, Name = "Fiat",  Price = 30000.0 },
        new Car { Id = 3, Name = "BMW",  Price = 100500.9 }
    });

【讨论】:

    【解决方案2】:

    更改未分配给初始变量。

    if (cars[i].Id==id)
    {
        cars = cars.RemoveAt(i);
    
        return Ok(cars);
    }
    

    【讨论】:

    • 汽车列表实例为每个请求创建。
    • 比 List 的 RemoveAt 方法有 void 返回类型,所以这段代码永远不会编译
    • 啊,当然,抱歉想到了 RemoveRange 和那些返回修改列表副本但不更改对象本身的函数类型。
    猜你喜欢
    • 2018-03-23
    • 2013-07-09
    • 1970-01-01
    • 2016-04-15
    • 2015-09-17
    • 2013-07-14
    • 1970-01-01
    • 2021-09-09
    • 2015-12-11
    相关资源
    最近更新 更多