2012-12-13 22 views
22

Próbuję dowiedzieć się, jak wysłać pewne informacje z formularza do działania interfejsu Web API. Jest to jQuery/AJAX Próbuję użyć:Wysyłanie obiektu JSON do interfejsu API WWW

var source = { 
     'ID': 0, 
     'ProductID': $('#ID').val(), 
     'PartNumber': $('#part-number').val(), 
     'VendorID': $('#Vendors').val() 
    } 

    $.ajax({ 
     type: "POST", 
     dataType: "json", 
     url: "/api/PartSourceAPI/", 
     data: JSON.stringify({ model: source }), 
     success: function (data) { 
      alert('success'); 
     }, 
     error: function (error) { 
      jsonValue = jQuery.parseJSON(error.responseText); 
      jError('An error has occurred while saving the new part source: ' + jsonValue, { TimeShown: 3000 }); 
     } 
    }); 

Oto mój model

public class PartSourceModel 
{ 
    public int ID { get; set; } 
    public int ProductID { get; set; } 
    public int VendorID { get; set; } 
    public string PartNumber { get; set; } 
} 

Oto mój widok

<div id="part-sources"> 
    @foreach (SmallHorse.ProductSource source in Model.Sources) 
    { 
     @source.ItemNumber <br /> 
    } 
</div> 
<label>Part Number</label> 
<input type="text" id="part-number" name="part-number" /> 

<input type="submit" id="save-source" name="save-source" value="Add" /> 

Oto moje działania kontroler

// POST api/partsourceapi 
public void Post(PartSourceModel model) 
{ 
    // currently no values are being passed into model param 
} 

Czego mi brakuje? teraz, gdy debuguję i przechodzę przez to, kiedy żądanie ajax uderza w działanie kontrolera, nic nie jest przekazywane do paramu modelu.

+0

Czy próbowałeś bez 'JSON.stringify'? 'data: {model: source}', lub może po prostu 'data: source' - jQuery obsługuje konwersję dla ciebie ... – nnnnnn

+0

Tak, próbowałem tego bez JSON.stringify, ale to też nie działało. Wypróbowałem każdą możliwą kombinację, którą mogę wymyślić po stronie AJAX, ale myślę, że jest coś, czego mi brakuje na kontrolerze. Nie wiem jednak, to jest tylko domysły. – Cory

+0

Kiedy mówisz "nic" jest przekazywane do paramera modelu, masz na myśli, że instancja "model" ma wartość zerową? Czy też jego wartości są wartościami domyślnymi/zerowymi?Co się stanie, jeśli zmienisz typ modelu na ciąg znaków, aby uzyskać reprezentację nieprzetworzoną, a nawet usunąć parametr wejściowy i sondować właściwości Request.Content i Request.Headers bezpośrednio, aby dowiedzieć się, co otrzymuje serwer? – Snixtor

Odpowiedz

27

Spróbuj tego:

jquery

$('#save-source').click(function (e) { 
     e.preventDefault(); 
     var source = { 
      'ID': 0, 
      //'ProductID': $('#ID').val(), 
      'PartNumber': $('#part-number').val(), 
      //'VendorID': $('#Vendors').val() 
     } 
     $.ajax({ 
      type: "POST", 
      dataType: "json", 
      url: "/api/PartSourceAPI", 
      data: source, 
      success: function (data) { 
       alert(data); 
      }, 
      error: function (error) { 
       jsonValue = jQuery.parseJSON(error.responseText); 
       //jError('An error has occurred while saving the new part source: ' + jsonValue, { TimeShown: 3000 }); 
      } 
     }); 
    }); 

Kontroler

public string Post(PartSourceModel model) 
    { 
     return model.PartNumber; 
    } 

Zobacz

<label>Part Number</label> 
<input type="text" id="part-number" name="part-number" /> 

<input type="submit" id="save-source" name="save-source" value="Add" /> 

Teraz po kliknięciu „Add” po wypełnieniu pola tekstowego The controller będą pluć powrotem, co napisałeś w polu PartNumber w pogotowiu.

+1

Dziękujemy! po prostu zmieniając 'data: source' naprawił go tak, by poprawnie wiązał się z parametrem" model "w kontrolerze. Myślałem, że muszę umieścić nazwę "model:" w moim ajax, aby działało. Wielkie dzięki! – Cory

+0

W przypadku złożonego formatu danych (który domyślnie nie może być deserializowany), musisz otrzymać ciąg json po stronie serwera. Twoja odpowiedź może działać dla prostych danych, ale nie będzie działać dla złożonego (co jest tym, co szukam haha). Twoja odpowiedź jest jednak dobra dla tego faceta! – Zwik

+0

Znalazłem, że musiałem włączyć 'contentType: 'application/json'' w moim wywołaniu ajax. Dlaczego ta odpowiedź tego nie wymaga? –

-4

wierzę trzeba cytaty całym model:

JSON.stringify({ "model": source }) 
+2

W literale obiektu nazwy właściwości nie muszą być cytowane, jeśli są literałami numerycznymi lub prawidłowymi nazwami identyfikatorów. Zatem '{model: source}' jest w porządku. – nnnnnn

+0

Czy korzystałeś z narzędzi do debugowania przeglądarki, aby sprawdzić, co jest wysyłane do metody działania w treści żądania? –

+0

Queti, tak, używam Skrzypka i mówi, że żadna treść nie została wysłana z żądaniem. – Cory

6

Zmiana:

data: JSON.stringify({ model: source }) 

Do:

:

data: {model: JSON.stringify(source)} 

aw kontrolerze to zrobić 10

Jeśli url użyć w jQuery jest /api/PartSourceAPI to nazwa kontrolera musi być api i działania (metoda) powinny być PartSourceAPI

+0

Próbowałem tego i nie sprawiło to żadnej różnicy. – Cory

+0

Zobacz moją poprawioną odpowiedź. – Jeroen

3
var model = JSON.stringify({ 
    'ID': 0, 
    'ProductID': $('#ID').val(), 
    'PartNumber': $('#part-number').val(), 
    'VendorID': $('#Vendors').val() 
}) 

$.ajax({ 
    type: "POST", 
    dataType: "json", 
    contentType: "application/json", 
    url: "/api/PartSourceAPI/", 
    data: model, 
    success: function (data) { 
     alert('success'); 
    }, 
    error: function (error) { 
     jsonValue = jQuery.parseJSON(error.responseText); 
     jError('An error has occurred while saving the new part source: ' + jsonValue, { TimeShown: 3000 }); 
    } 
}); 

var model = JSON.stringify({  'ID': 0,  ...': 5,  'PartNumber': 6,  'VendorID': 7 }) // output is "{"ID":0,"ProductID":5,"PartNumber":6,"VendorID":7}" 

dane jest coś takiego "{" model ": "id": 0" ProductID ": 6" Kem ": 7" VendorID ": 8}}" kontroler api internetowa nie może powiąż go ze swoim modelem

Powiązane problemy