.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(formcollection); 【参考方案1】:

我假设你知道你正在使用方法......所以

    检查参数是否已绑定,否则您将永远无法通过第一次检查,并且您不会看到错误,因为不需要 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?

用于 asp.net web api 的 PUT 和 DELETE 的 discountasp.net 问题

ASP.NET Web API - 不允许 PUT 和 DELETE 动词 - IIS 8