2012-12-10 16 views
9

का उपयोग करके कई रिश्तों में HTTP पोस्ट HTTP मैं एएसपीनेट (और सामान्य रूप से प्रोग्रामिंग) के लिए नया हूं और मुझे वेब एपीआई बनाने में परेशानी हो रही है। अधिक विशेष रूप से मुझे इन दो क्षेत्रों में सहायता चाहिए:एएसपी.NET वेब एपीआई

  1. नया दस्तावेज़ (डीओसी तालिका) पोस्ट करने के लिए मेरे DOCcontroller को कॉन्फ़िगर कैसे करें।
  2. वास्तविक AJAX पोस्ट कैसे करें - मुझे EXT_GUID पैरामीटर को पार करने में समस्या हो रही है। जैसा कि यह खड़ा है, जब मैं पोस्ट करने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है। "अनुरोध की सामग्री में एकाधिक पैरामीटर (डॉक्टर और पैरेंटऑनर) को बाध्य नहीं कर सकता।"

अनिवार्य रूप से यह एक साधारण दस्तावेज़ प्रबंधन प्रणाली के लिए है। मैं उपयोगकर्ता को एक बाहरी डेटाबेस (EXT_GUID फ़ील्ड) से एक फ़िल्टर/पैरामीटर के रूप में एक GUID आपूर्ति करके प्राप्त/पोस्ट दस्तावेज़ (डीओसी) प्राप्त करना चाहता हूं। प्रत्येक दस्तावेज़ में कई EXT_GUIDs हो सकती हैं और प्रत्येक EXT_GUID में एकाधिक दस्तावेज़ (डीओसी) हो सकते हैं। आप मान सकते हैं कि EXT_GUID फ़ील्ड्स जिन्हें हम http पोस्ट से पहले पॉप्युलेट करते हैं।

यह 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

वेबएपी में एकाधिक पोस्ट पैरामीटर के साथ समस्याओं के बारे में निम्नलिखित पर नज़र डालें: 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; } 
} 

फिर अपने postdoc विधि हो जाएगा:

  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); 
       } 
      } 
संबंधित मुद्दे