2012-12-10 12 views
9

私はASP.net(およびプログラミング全般)を初めて使用しており、Web APIの構築には問題があります。具体的には、私はこれらの2つの領域での支援が必要な:私のDOCcontroller新しいドキュメントを投稿する(DOCテーブル)を設定する方法ASP.NET Web APIを使用して多対多リレーションシップレットへのHTTP POST

  1. 実際のAjax投稿を作成する方法 - EXT_GUIDパラメータを渡す際に問題があります。それが立つと、私は投稿しようとするとエラーになります。 "複数のパラメータ(docとparentOwner)をリクエストのコンテンツにバインドできません。"

これは、基本的には簡単な文書管理システムです。ユーザーが外部データベース(EXT_GUIDフィールド)からGUIDをフィルタ/パラメータとして指定することによって、Get/Postドキュメント(DOC)を作成します。各ドキュメントは複数のEXT_GUIDを持つことができ、各EXT_GUIDは複数のドキュメント(DOC)を持つことができます。 http投稿の前に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 ビデオは6時間ですが、十分に価値があります。また、メンバーシップは本当に価値がありますが、トレイルにサインアップするとソースコードもダウンロードできます。 –

+0

WebApiの複数のPOSTパラメータに関する問題について、以下を参照してください。http://forums.asp.net/t/1810709.aspx/1 –

答えて

0

クライアントから受け取ったものと、データベースに保存するものは2つの異なるものです。 あなたのdocオブジェクトはokです:

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); 
       } 
      } 
関連する問題