2013-08-06 16 views
11

Próbuję przekazać niektóre proste JSON do programu ASP.NET 4.5 Webmethod z jQuery. I nie działa tak, jak tego chcę. To działa, jeśli przyjąć wejść jako oddzielne parametry:Przepuścić obiekt zdefiniowany przez użytkownika do ASP.NET Webmethod z jQuery, przy użyciu JSON

[WebMethod] 
public static Address GetJSonAddress(string name, string street) 

Ale jeśli próbuję wziąć go jako obiekt to nie działa, co zostanie przeniesiony w to po prostu zerowa:

[WebMethod] 
public static Address GetJSonAddress(Address newAddress) 

mam wypróbowałem Webmethods, Pagemethods, WCF przy użyciu DataContractJsonSerializer ... nic. Klasa adresu jest odpowiednio udekorowana przy pomocy Datamember/DataContract. Właściwości są dopasowane, w tym przypadku.

The jQuery, w którym próbowałem wszelkiego rodzaju przekazywania danych, w tym zawijanie go w obiekcie Address ... jeśli zrobię to w inny sposób niż to, co mam Webmethod nie jest wywoływane i otrzymuję błąd 500 :

Save2 = function() { 
var address = { prefix: GLOBALS.curr_prefix }; 

$('input[id^=' + GLOBALS.curr_prefix + '],select[id^=' + GLOBALS.curr_prefix + ']').each(function() { 
     address[this.id.substr(4)] = $.trim($(this).val()); 
}) 

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "/WebServices/Insert", 
    data: JSON.stringify(address), 
    dataType: "json", 
    success: function (data, textStatus) { 
     console.log(data, textStatus); 
    }, 
    failure: function (errMsg) { 
     MsgDialog(errMsg); 
    } 
}); 
} 

Ostatecznie będę musiał to zrobić z 121 ciągami wejściowymi i tak naprawdę nie chcę mieć metody z 121 parametrami. Każda pomoc jest doceniana.

+1

Co się stanie, jeśli używasz 'dane: {newAddress: JSON.stringify (adres)}'? – NoLifeKing

+0

Webmethod nie jest wywoływany i pojawia się błąd 500 w przeglądarce. POST wygląda ok: {'Adres': {"imię": "imię", "ulica": "ulica", "miasto": "miasto", "zip": "11111"}} –

Odpowiedz

-1

I am not aware of ASP. Ale w Ruby on Rails używamy poniższej procedury. Moja forma ma prawie 20 pól. Poprzez serializeArray(); mogę wysłać wszystkie wartości pól wejściowych do kontrolera. Jak

Twój HTML powinna wyglądać

<input class="input" id="violation_date" type="text" name="violation_date" value=""/> 

"name" dziedzinie jest tutaj mportant.

var form = $("form#driver_info_form").serializeArray(); 
var hsh = { } 
$.each(form, function(i, e) { 
      hsh[e.name] = e.value 
     }); 

var jqxhr = $.post("/app/DriverInfo/save_driver_info", { 
      hsh: hsh 
     }, function() { }); 

Na stronie sterownika możemy uzyskać param jak

{"hsh"=>{"violation_date"=>"date", "violation_time"=>"time", "violation_day"=>"week", "username"=>"name", "address"=>"address", "city"=>"city", "state"=>"state", "zip"=>"", "driver_lic_number"=>"123324", "radio_commercial"=>"Yes", "age"=>"", "birth_date"=>"", "sex"=>"", "hair"=>"", "eyes"=>"", "height"=>"", "weight"=>"", "race"=>""}, "accident_check"=>"false", "misdemeanor"=>"false", "traffic"=>"false", "non_traffic"=>"false", "commercial"=>"Yes"} 

Z tego możemy uzyskać dostęp do wartości.

Mam nadzieję, że to da ci jakąś wskazówkę.

+0

Jakiego rodzaju wytyczne powinny to daje OP? Zadał konkretne pytanie asp.net, a ty odpowiedziałeś, jak zrobiłbyś to w zupełnie innym środowisku. – NoRyb

36

Szybko skonfigurowałem ten projekt i udało mi się z powodzeniem połączyć z moją metodą internetową, odpowiednio dostosuj swój kod. Upewnij się, że twoje nazwy klas klasy są takie same jak te, które przechodzą przez JavaScript.

Webservice

public static Contact getContact(Contact cnt) 
    { 
     cnt.name = "Abijeet Patro"; 
     cnt.phone = "Blah Blah"; 
     return cnt; 
    } 

JavaScript/jQuery

$(document).ready(function() { 
     var cnt = {name:'Hello',phone:'Hello'}; 
     $.ajax({ 
      type: "POST", 
      url: "/Default.aspx/getContact", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      data: JSON.stringify({'cnt':cnt}), // Check this call. 
      success: function (data) { 
       debugger; 
      } 
     }); 
    }); 

Klasa

public class Contact 
{ 
    public string name { get; set; } 
    public string phone { get; set; } 
} 

Web Service Called


enter image description here

można pobrać projekt z here. Użyj też skrzypka lub przeglądarki Chrome do monitorowania żądań/odpowiedzi AJAX. Dodałem obraz, by pokazać, jak monitorować żądania AJAX za pomocą Chrome. Fiddler jest jeszcze lepszy i bardziej szczegółowy.


enter image description here

+0

Dziękuję, to było bardzo pomocne i widzę, co robiłem źle. W moim przypadku nie było to statyczne w Webmethod (przeciwieństwo robienia tego w WCF) i niepoprawne składni JSON.Stringify. –

+0

Dziękuję bardzo! –

Powiązane problemy