[英]Unable to PUT with Angularjs $http.put, receive Invalid JSON primitive
[英]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.