2012-12-10 6 views
9

Jestem nowicjuszem ASP.net (i ogólnie programowaniem) i mam problem z budowaniem Web API. Dokładniej trzeba pomóc w tych dwóch obszarach:HTTP POST do relacji Wiele do wielu przy użyciu interfejsu ASP.NET Web API

  1. Jak skonfigurować mój DOCcontroller aby opublikować nowy dokument (tabela DOC).
  2. Jak zrobić faktyczny wpis ajax - Mam problem z podaniem parametru EXT_GUID. W obecnej wersji pojawia się błąd, gdy próbuję opublikować. "Nie można powiązać wielu parametrów (doc i parentOwner) z treścią żądania."

Zasadniczo chodzi o prosty system zarządzania dokumentami. Chcę mieć dokumenty Get/Post (DOC), jeśli użytkownik dostarcza identyfikator GUID z zewnętrznej bazy danych (pole EXT_GUID) jako filtr/parametr. Każdy dokument może mieć wiele identyfikatorów EXT_GUID, a każdy EXT_GUID może mieć wiele dokumentów (DOC). Możesz założyć, że pola EXT_GUID zostaną wypełnione przed postem HTTP.

Jest to kod 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); 
    } 
} 

To jest mój model setup - EntityFramework codefirst rzeczy

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; } 
} 

To więcej bagażu model ...

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"); 
    }); 
} 

kod 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

Więc ten facet „John Papa” miał poradnik, który wyjaśnił, co starałem się zrobić, i wiele więcej. Objaśnienie przepływu pracy było idealne dla mojego poziomu zrozumienia (i zaangażowania w uczenie się). http://pluralsight.com/training/Courses/TableOfContents/spa To sześć godzin wideo, ale warto. Możesz także pobrać kod źródłowy, jeśli zarejestrujesz się na szlaku - chociaż członkostwo jest naprawdę tego warte. –

+0

Spójrz na następujące kwestie dotyczące problemów z wieloma parametrami POST w WebApi: http://forums.asp.net/t/1810709.aspx/1 –

Odpowiedz

0

To, co otrzymujesz od klienta i co zapiszesz w bazie danych, to dwie różne rzeczy. Twój obiekt doc jest ok:

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

Teraz trzeba zmienić logikę serwera. Uczynić model tak:

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

Następnie metoda postdoc będą:

  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); 
       } 
      }