2013-03-28 11 views
17

Sto provando a scrivere nel mio database usando AJAX/Jquery e C#. Ogni volta che passo il parametro nel codice C# lo mostra come nullo. Sto usando il modello predefinito che lo studio visivo genera durante la creazione di una classe controller. Qualsiasi aiuto sarebbe apprezzato!AJAX & Web Api Post Method - Come funziona?

NOte: questo è un servizio di assistenza che sto tentando di chiamare. (. Un sito web regolare ASP ... non MVC Inoltre, l'API REST GET funziona perfettamente.)

Jquery/AJAX:

 var dataJSON = { "name": "test" } 

     $('#testPostMethod').bind("click", GeneralPost); 
     function GeneralPost() { 
      $.ajax({ 
       type: 'POST', 
       url: '../api/NewRecipe', 
       data:JSON.stringify(dataJSON), 
       contentType: 'application/json; charset=utf-8', 
       dataType: 'json' 
      }); 
     } 

C#

//If I remove the [FromBody] Tag then when I click the button this method is never called. 
    public void Post([FromBody]string name) 

    { 

    } 

EDIT:

Ho modificato leggermente il mio codice ma sto ancora riscontrando lo stesso problema. Per ricapitolare, sta caricando il metodo POST, ma sta passando in null.

C#

public class RecipeInformation 
    { 
     public string name { get; set; } 

    } 

     public void Post(RecipeInformation information) 

     { 

     } 

AJAX:

var dataJSON = { information: { name: "test" } }; 

    $('#testPostMethod').bind("click", GeneralPost); 
    console.log(dataJSON); 
    function GeneralPost() { 
     $.ajax({ 
      type: 'POST', 
      url: '../api/NewRecipe', 
      data: dataJSON, 
      contentType: 'application/json; charset=utf-8', 
     }); 
    } 
+0

La parte 'Post (nome stringa)' di un'applicazione MVC, un servizio Web o cosa? – Yuck

+0

È questo MVC o ASP? – Rob

+0

Siamo spiacenti, questo è ASP - un servizio di Rest. Il GET funziona perfettamente. – Yecats

risposta

39

Per tipo semplice, sul lato server:

public void Post([FromBody]string name) 
{ 
} 

sul lato client, è sufficiente definire se si desidera inviare in formato JSON:

var dataJSON = "test"; 

    $('#testPostMethod').bind("click", GeneralPost); 
    function GeneralPost() { 
     $.ajax({ 
      type: 'POST', 
      url: '/api/NewRecipe', 
      data: JSON.stringify(dataJSON), 
      contentType: 'application/json; charset=utf-8', 
      dataType: 'json' 
     }); 
    } 

Se si vuole farlo funzionare nel tipo complesso, dal lato server è necessario definire:

public class RecipeInformation 
{ 
    public string name { get; set; } 
} 

public class ValuesController : ApiController 
{ 
    public void Post(RecipeInformation information) 
    { 
    } 
} 

E dal lato client:

var dataJSON = { name: "test" }; 

    $('#testPostMethod').bind("click", GeneralPost); 
    function GeneralPost() { 
     $.ajax({ 
      type: 'POST', 
      url: '/api/NewRecipe', 
      data: JSON.stringify(dataJSON), 
      contentType: 'application/json; charset=utf-8', 
      dataType: 'json' 
     }); 
    } 
+1

Ah! Finalmente una soluzione che funziona! Ho testato il tipo complesso e funziona perfettamente :) :) – Yecats

+0

Come aggiungerei più parametri ai miei dati complessi? Questo JSON non funziona oltre il nome - var dataJSON = {nome: "test", categoria: "1", prepTime: "60", cookTime: "40", standTime: "32", imgPath: "something.jpg" , stato: "1"}; – Yecats

+0

In json, il valore può essere un altro oggetto json (ad es .: '{nome:" test ", categoria:" 1 ", ora: {prepTime:" 60 ", cookTime:" 40 "}, standTime:" 32 ", imgPath: "something.jpg", stato: "1"} ' –

2

Suppongo che si sta utilizzando ASP.NET WebAPI e legare tutti i tipi semplici (int, bool, stringhe, ecc) da URL e tutti tipi complessi dal corpo. Quando hai contrassegnato il nome con l'attributo FromBody, lo associa dal corpo della richiesta anziché dalla mappatura URL.

Potete leggere di più su ASP.NET WebAPI il routing e il parametro vincolante qui:

+0

Ho usato solo dabody perché il template lo ha generato come tale. Ho aggiornato il mio codice qui sopra per riflettere su come mi piacerebbe davvero passare le informazioni. – Yecats

+0

Questa è stata un'ottima lettura, grazie per averlo inviato! – Yecats

0

C'è un pezzo che ti manca è gli attributi del contratto dati Se si effettua una classe come:

[DataContract] 
public class RecipeInformation 
{ 
    [DataMember] 
    public string name { get; set; } 
} 

Questi attributi si trovano in System.Runtime.Serialization e il parser Json (Json.NET) li utilizza per (help) deserializzare il modello.

+1

Sfortunatamente, questo non risolve il problema. – Yecats

2

Si può provare a fare qualcosa di simile e utilizzare il metodo di jQuery param

var postData = { 
     name : 'name' 
    } 

    $('#testPostMethod').bind("click", GeneralPost); 
    function GeneralPost() { 
     $.ajax({ 
      type: 'POST', 
      url: '../api/NewRecipe', 
      data: $.param(postData,true), 
      contentType: 'application/json; charset=utf-8', 
      dataType: 'json' 
     }); 
    } 
+0

Non sembra che sia stato risolto il problema. Sto ancora incontrando lo stesso problema. – Yecats

1

Legatura in controllori API è un po 'sul lato strano. Credo:

public void Post([FromBody]RecipeInformation information) 

con

var dataJSON = { name: "test" }; 

dovrebbe funzionare, e sicuramente funzionerà solo se si passa come dati del modulo.

+0

L'ho provato (e l'ho provato di nuovo). Questo non sembra funzionare :( – Yecats

0

ho trovato il problema con l'aiuto di Microsoft Docs codice Usa JS come detto

$.post('api/updates/simple', { "": $('#status1').val() }); 

Quello che mi è mancata è stata l'aggiunta di nome della proprietà vuota, così che cosa OP deve fare è {"":data:JSON.stringify(dataJSON)}, invece di data:JSON.stringify(dataJSON),