.net web api 在 PUT 上更新模型
Posted
技术标签:
【中文标题】.net web api 在 PUT 上更新模型【英文标题】:.net web api updating model on PUT 【发布时间】:2013-03-19 18:29:32 【问题描述】:所以我正在尝试更新模型。以下是我的模型的设置方式:
public class Event
public int Id get;set;
public string Name get;set;
public DateTime Date get;set;
public int Organizerid get;set;
public virtual User Organizer get;set;
public class Organizer
public int Id get;set;
public string Name get;set;
pubilc virtual iCollection<Event> Events get;set;
现在我为事件 (EventViewModel) 创建了一个 ViewModel,因为每当我返回常规事件时,它都会在我身上抛出一个循环错误,我必须在我拉出的每个模型上的每个虚拟机上使用 [JsonIgnore]向上。此外,它还可以防止 web api 返回有关当前模型的过多信息。不需要的信息。
我的视图模型
public class EventVM
public string Name get;set;
public DateTime Date get;set;
话虽如此,这就是我处理 PUT 的方式
[HttpPut]
public HttpResponseMessage Put(int eventId, EventVM event)
if (ModelState.IsValid && eventId== event.Id)
try
Event upEvent = dbcontext.Event.FirstOrDefault(e => e.Id == eventId);
upEvent.Name = eventVM.Name;
upEvent.Date = eventVM.Date;
dbcontext.SaveChanges();
return Request.CreateResponse(HttpStatusCode.OK);
catch(Exception ex)
return Request.CreateResponse(HttpStatusCode.BadRequest);
else
return Request.CreateResponse(HttpStatusCode.BadRequest);
我的问题是它没有保存更新。我会做一个 TryUpdateModel 但它似乎不能与 WebApi 一起使用。帮助!想法?
【问题讨论】:
您使用的是什么数据库? “icdb.SaveChanges()”我觉得应该是dbcontext.SaveChanges()吧? 我的错,我刚改了。来自另一个项目。 你调试了吗?我假设您正在使用实体框架。我认为你的代码对我来说看起来是正确的......只要确保你可以通过你传入的 id 检索事件 是的,我可以获取带有 id 的实例。它似乎并没有与上下文相关联。 问题是你的表单可能正在发帖,这已经在这里了,然后再看这里:***.com/questions/8182620/… 作为旁注,你为什么不只是发布模型,或者使用tryupdatemodel 但使用 formcollection 形式而不是模型 TryUpdateModel我假设你知道你正在使用方法......所以
检查参数是否已绑定,否则您将永远无法通过第一次检查,并且您不会看到错误,因为不需要 mv 参数。好吧,您会在客户端看到错误的请求,但代码中什么也没有。
正如 ArdVark71 指出的,您的视图模型不包含 id
确保您的 dbContext 不为空
在您的尝试中upEvent.Name = eventVM.Name;
upEvent.Date = eventVM.Date;
eventVM 不存在
您的实体是否有您未填写的要求?喜欢组织者?
此外,日期和名称是错误的变量名称,我们的数据库人员会疯掉 =]无论如何,如果这听起来太像代码审查,那么很抱歉,但是当出现代码问题时很难排除故障。还假设这些都只是拼写错误,您的 dbcontext 等仍然可能存在问题。因此,如果其他一切看起来都正确,请单步执行您的代码并查看 dbcontext,它是否在保存时隐藏了任何内容等?
祝你好运
【讨论】:
【参考方案2】:假设您使用的是实体框架,并且您的示例可能与真实代码有些不完整。这可能是分离实体的问题。
尝试添加以下内容:
upEvent.State = EntityState.Modified);
dbcontext.SaveChanges();
dbcontext.SaveChanges();
请参阅this question 了解更多信息。
【讨论】:
upEvent 不包含 State 属性。 好吧,也许试试 dbcontext.ObjectStateManager.ChangeObjectState(upEvent, EntityState.Modified)【参考方案3】:也许你的代码中的某个地方有?
context.Configuration.AutoDetectChangesEnabled = false;
修改事件后,如果上下文看到属性已修改,您也可以检查此项
var nameIsModified = dbcontext.Entry(upEvent).Property(u => u.Name).IsModified;
您也可以强制更新数据库(尽管我不会将此视为解决方案,而是将其视为解决方法,直到您诊断出问题为止)
dbcontext.Entry(upEvent).Property(u => u.Name).IsModified = true;
将属性标记为已修改会在调用 SaveChanges 时强制将更新发送到该属性的数据库,即使该属性的当前值与其原始值相同 - MSDN
【讨论】:
以上是关于.net web api 在 PUT 上更新模型的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?
VB.NET Web API CORS PUT 预检 405 错误
API 未在 axios put 中检测 PUT 请求中的模型
如何从 ASP.NET MVC 到 ASP.NET Core Web API 的 PUT?