C# 使用AngularJS';s$http.put方法
我试图使用AngularJS使用$http.put方法更新一些数据。但是,我尝试了几种调用此方法的变体,它多次未能在我的控制器中调用put方法,或者,如果调用了,它将创建一个新实体,而不是更新旧数据。这是我的密码: (我知道我的api的其余部分作为post和get工作,适用于汽车) CarController.csC# 使用AngularJS';s$http.put方法,c#,angularjs,entity-framework,http,C#,Angularjs,Entity Framework,Http,我试图使用AngularJS使用$http.put方法更新一些数据。但是,我尝试了几种调用此方法的变体,它多次未能在我的控制器中调用put方法,或者,如果调用了,它将创建一个新实体,而不是更新旧数据。这是我的密码: (我知道我的api的其余部分作为post和get工作,适用于汽车) CarController.cs public void Put(int CarId, [FromBody] Car c) { System.Diagnostics.Debug.Wri
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);
}
}
存储库(“回购”):
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上下文),并创建内存中的列表。然后从该列表中删除该项,这将不会完成任何事情,因为在任何后续代码中都不会使用该列表。这不会从数据库中删除实体,我认为这是您的意图。在任何情况下,您都希望更新现有的汽车,而不是删除并重新添加它(至少这是我的假设)
这总是会增加一辆新车
你想要的东西更像:
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;
\u 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();
否则,菲尔是正确的:
_ctx.Cars.Add(car);
将始终给您一个新记录您说它不调用put方法,但当它调用时,它会创建一个新实体。是哪篇?在这篇文章和你的另一篇文章之间,你在这个问题上投入太多了。它们似乎都是关于(1)使用angular调用控制器方法和(2)为什么实体框架插入一个项而不是更新。调试你的代码,并开始将这些问题分离成单独的问题。问题是我所采取的每种方法都做了一些不同的事情,没有一种做了我想做的事情,所以我希望确保我没有因为对这种方法的无知而做错事,而我的另一篇文章则在问我是否有什么方法我还没有尝试过将工作并考虑使用$资源服务,因为它将帮助调用大量的样板来调用REST API。不可能回答您的问题,因为没有更多的信息,没有人能知道它是否是控制器和模型绑定、角度设置或实体框架代码的问题。谢谢。我来试试这个
// 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();
_ctx.Cars.Add(car);