2012-12-10 4 views
9

Sono nuovo ad ASP.net (e alla programmazione in generale) e sto riscontrando problemi nella creazione di un'API Web. Più in particolare ho bisogno di aiuto in queste due aree:HTTP POST a relazione molti a molti utilizzando l'API Web ASP.NET

  1. Come configurare il mio DOCcontroller per pubblicare un nuovo documento (tabella DOC).
  2. Come rendere effettivo il post ajax - Sto riscontrando problemi nel passaggio del parametro EXT_GUID. Così com'è, ricevo un errore quando provo a postare. "Impossibile associare più parametri (doc e parentOwner) al contenuto della richiesta."

Essenzialmente questo è per un semplice sistema di gestione dei documenti. Desidero documenti Get/Post (DOC) che l'utente fornisce un GUID da un database esterno (il campo EXT_GUID) come filtro/parametro. Ogni documento può avere più EXT_GUID e ciascun EXT_GUID può avere più Documenti (DOC). Puoi supporre che i campi EXT_GUID vengano compilati prima del post http.

Questo è il codice 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); 
    } 
} 

Questa è la mia messa a punto del modello - EntityFramework roba 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; } 
} 

Questo è più bagagli modello ...

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

codice 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

Così questo ragazzo "John Papa" aveva un tutorial che ha spiegato quello che stavo cercando di fare e molto di più. La spiegazione del flusso di lavoro era perfetta per il mio livello di comprensione (e impegno per l'apprendimento). http://pluralsight.com/training/Courses/TableOfContents/spa Sono sei ore di video, ma ne vale la pena. Puoi anche scaricare il codice sorgente se ti iscrivi a un percorso, anche se l'iscrizione ne vale davvero la pena. –

+0

Dai un'occhiata ai seguenti problemi relativi a più parametri POST in WebApi: http://forums.asp.net/t/1810709.aspx/1 –

risposta

0

Ciò che si riceve dal client e ciò che si salverà nel database sono due cose diverse. Il vostro documento è ok:

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

Ora è necessario cambiare la logica del server. Fare un modello come questo:

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

Allora il tuo metodo di postdoc saranno:

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