繁体   English   中英

使用AngularJS的$ http.put方法

[英]Using AngularJS's $http.put method

我正在尝试使用AngularJS通过$ http.put方法更新一些数据。 但是,我尝试了几种方法来调用此方法,但它反复无法在控制器中调用put方法-或者,如果这样做,它将创建一个新实体而不是更新旧数据。 这是我的代码:

(我知道我的api的其余部分都可以发布,并且可以在汽车上正常工作)

CarController.cs

    public void Put(int CarId, [FromBody] Car c)
    {
        System.Diagnostics.Debug.WriteLine("CarController.Put() Called");
        c.CarId = CarId;
        if (!_repo.UpdateCar(c) || !_repo.Save())
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
    }

储存库(“ _repo”):

    public bool UpdateCar(Car car)
    {
        if (car == null)
        {
            throw new ArgumentNullException("car");
        }
        int index = _ctx.Cars.ToList().FindIndex(c => c.CarId == car.CarId);
        if (index == -1)
        {
            return false;
        }
        _ctx.Cars.ToList().RemoveAt(index);
        _ctx.Cars.Add(car);
        return true;

    }

AngularJS脚本:

var _linkPersonAndCar = function(person, car) {
    var deferred = $q.defer();

    alert("_linkPersonAndCar()\nPerson = " + JSON.stringify(person) + "\nCar = " + JSON.stringify(car));

    //Update car
    car.persons.splice(0, 0, person);

    alert("_linkPersonAndCar() attempting put");

    $http.put("/api/cars/"+car.carId, car)
        .then(function ()
        {
            alert("_linkPersonAndCar() - Success!");
            deferred.resolve();
        },
        function ()
        {
            alert("_linkPersonAndCar() - Failure updating car");
            deferred.reject();
        });

    alert("_linkPersonAndCar() - Complete");

    return deferred.promise;
};

好吧,请参阅我的评论以获取将其分解为单独问题的建议。 但是我发现您的EF代码至少有一个问题:

_ctx.Cars.ToList().RemoveAt(index);

调用ToList()会创建一个与提供程序断开连接的列表(EF上下文),并创建一个内存中列表。 然后,您从该列表中删除该项目,这将不会完成任何操作,因为您不会在任何后续代码中使用该列表。 这不会从数据库中删除实体,我认为这是您的意图。 无论如何,您都想更新现有的汽车,而不是删除并重新添加(至少是我的假设)。

_ctx.Cars.Add(car);

这将始终添加新车。

您想要更多类似的东西:

var ctxCar = _ctx.Cars.SingleOrDefault(c => c.CarId = car.CarId);

if (ctxCar == null)
{
  return false;
}

//here you want map properties from your parameter to your context's car
ctxCar.Property1 = car.Property1;
//etc.

return true;

_ctx是EF上下文吗? 如果是这样,则附加应该起作用:

// connect to context
_ctx.Cars.Attach(car);
// check for updated info
var entry = _ctx.Entry(car);
entry.Property(e => e.NumberOfDoors).IsModified = true;
// save changes
_ctx.SaveChanges();

否则,Phil是正确的:

_ctx.Cars.Add(car);

会永远给你新的记录

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM