2012-12-10 64 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); 
       } 
      } 
相關問題