2012-12-10 30 views
9

我是ASP.net(以及一般编程)的新手,并且在构建Web API时遇到问题。更具体地说,我需要以下两方面的帮助:使用ASP.NET Web API进行多对多关系的HTTP POST

  1. 如何配置我的DOCcontroller以发布新文档(DOC表)。
  2. 如何制作实际的ajax文章 - 我无法通过EXT_GUID参数。按照现状,我在尝试发布时遇到错误。 “无法将多个参数(doc和parentOwner)绑定到请求的内容。”

本质上这是一个简单的文件管理系统。我想通过让用户从外部数据库(EXT_GUID字段)提供GUID作为过滤器/参数来获取/发布文档(DOC)。每个文档可以有多个EXT_GUID,每个EXT_GUID可以有多个文档(DOC)。你可以假设我们在http post之前填充了EXT_GUID字段。

这是DOCcontroller代码

//POST api/DOC 
public HttpResponseMessage PostDOC(DOC doc, List<string> parentOwners) 
{ 
    if (ModelState.IsValid) 
    {    
     var parents = db.BIMs.Where(bx => parentOwners.Contains(bx.EXT_GUID)); 

     foreach (var p in parents) 
     doc.Owners.Add(p); 

     db.DOCs.Add(doc); 
     db.SaveChanges(); 

     HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, doc); 
     response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = doc.Id })); 
     return response; 
    } 
    else 
    { 
     return Request.CreateResponse(HttpStatusCode.BadRequest); 
    } 
} 

这是我的模型建立 - 的EntityFramework codefirst东西

public class EXT 
{ 
    public int Id { get; set; } 
    public string EXT_GUID { get; set; } 
    public int ProjectID { get; set; } 
    public virtual ICollection<DOC> DOCs { get; set; } 
} 

public class DOC 
{ 
    public int Id { get; set; } 
    public int ProjectID { get; set; } 
    public string Subject { get; set; } 
    public string Link { get; set; } 
    public virtual ICollection<EXT> EXTs { get; set; } 
} 

这是更存储模型...

public StoreDBContext() : base("name=StoreDBContext") 
{ 
} 
public DbSet<EXT> EXTs { get; set; } 
public DbSet<DOC> DOCs { get; set; } 
protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    //Set FLUENT API config for many to many here 
    modelBuilder.Entity<EXT>() 
    .HasMany(a => a.DOCs) 
    .WithMany() 
    .Map(x => 
    { 
     x.MapLeftKey("EXT_Id"); 
     x.MapRightKey("DOC_Id"); 
     x.ToTable("EXTsDOCs"); 
    }); 
} 

Ajax代码

function AddDOC() { 
    var parentOwner = "{\"" + $('#txtaddEXT').val() + "\"}"; 
    jQuery.support.cors = true; 
    var DOC = { 
     ProjectId: ProjectID, 
     Subject: $('#txtaddDOCSubject').val(), 
     Link: $('#txtaddDOCLink').val(), 
      parentOwner: parentOwner 
    }; 

    $.ajax({ 
     url: "http://localhost:54171/api/DOC/", 
     type: 'POST', 
     data: JSON.stringify(DOC), 
     contentType: "application/json;charset=utf-8", 
     success: function (data) { 
      WriteResponse(data); 
     }, 
     error: function (x, y, z) { 
      alert(x + '\n' + y + '\n' + z); 
     } 
    }); 
} 
+1

原来这小子“约翰爸爸”有一个教程,解释什么,我试图做和更多。工作流程的解释非常适合我的理解水平(以及对学习的承诺)。 http://pluralsight.com/training/Courses/TableOfContents/spa 这是六个小时的视频,但非常值得。你也可以下载源代码,如果你注册一个线索 - 虽然会员真的值得。 –

+0

看看在多的WebAPI POST参数以下有关问题:http://forums.asp.net/t/1810709.aspx/1 –

回答

0

从客户端收到的内容以及要保存在数据库中的内容有两点不同。 您的文档对象是确定的:

var DOC = { 
    ProjectId: ProjectID, 
    Subject: $('#txtaddDOCSubject').val(), 
    Link: $('#txtaddDOCLink').val(), 
    parentOwner: parentOwner 
}; 

现在,您需要更改服务器的逻辑。做一个模型是这样的:

public class DocReceivedModel 
{ 
    public int ProjectID { get; set; } 
    public string Subject { get; set; } 
    public string Link { get; set; } 
    public List<string> parentOwner { get; set; } 
} 

那么你的博士后方法是:

  public HttpResponseMessage PostDOC(DocReceivedModel docReceived) 
      { 
       if (ModelState.IsValid) 
       { 
        Doc newDoc = new Doc(); 
        newDoc.ProjectID = docReceived.ProjectID 
        newDoc.Subject = docReceived.Subject 
        newDoc.Link = docReceived.Link 

        var parents = db.BIMs.Where(bx => docReceived.parentOwners.Contains(bx.EXT_GUID)); 
        foreach (var p in parents) 
         newDoc.Owners.Add(p); 
          // I not see in your model Owners, maybe this is EXTs but I suppose you catch the idea 

        db.DOCs.Add(newDoc); 
        db.SaveChanges(); 

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, newDoc); 
        response.Headers.Location = new Uri(Url.Link("DefaultApi", new {id = newDoc.Id})); 
        return response; 
       } 
       else 
       { 
        return Request.CreateResponse(HttpStatusCode.BadRequest); 
       } 
      } 
相关问题