2013-08-06 14 views
11

Sto provando a passare in alcuni semplici JSON a un metodo Web ASP.NET 4.5 da jQuery. E non sta funzionando nel modo in cui lo voglio. Funziona se accetto gli ingressi come parametri separati:Passare un oggetto definito dall'utente a ASP.NET Webmethod da jQuery, utilizzando JSON

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

Ma se provo a prenderlo come un oggetto che non funziona, ciò che viene passato è semplicemente nullo:

[WebMethod] 
public static Address GetJSonAddress(Address newAddress) 

ho provato Webmethods, Pagemethods, WCF usando DataContractJsonSerializer ... niente. La classe Address è decorata in modo appropriato con Datamember/DataContract. Le proprietà sono abbinate compreso il caso.

Il jQuery, in cui ho provato ogni sorta di passaggio dei dati incluso il wrapping in un oggetto Address ... se lo faccio in un altro modo rispetto a quello che ho il Webmethod non viene chiamato e ottengo l'errore 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); 
    } 
}); 
} 

alla fine mi avrà a che fare questo con 121 stringhe di input, e davvero non vogliono avere un metodo con 121 parametri. Qualsiasi aiuto è apprezzato.

+1

Cosa succede se si utilizza 'data: {newAddress: JSON.stringify (indirizzo)}'? – NoLifeKing

+0

Il Webmethod non viene chiamato e ricevo l'errore 500 nel browser. Il POST sembra ok: {'Indirizzo': {"nome": "nome", "via": "via", "città": "città", "zip": "11111"}} –

risposta

-1

I am not aware of ASP. Ma in Ruby on Rails stiamo utilizzando la procedura seguente. La mia forma ha quasi 20 campi. Attraverso serializeArray(); posso inviare tutti i valori del campo di input al controller. Come

tuo HTML dovrebbe essere l'aspetto di

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

"name" campo è mportante qui.

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() { }); 

su lato controllore possiamo ottenere param come

{"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"} 

Da questo possiamo accedere ai valori.

Spero che questo vi fornisca alcune linee guida.

+0

Che tipo di linea guida dovrebbe questo dare a OP? Ha fatto una domanda specifica a asp.net e tu rispondi a come lo faresti in un ambiente completamente diverso. – NoRyb

36

Ho impostato rapidamente questo progetto e sono stato in grado di chiamare con successo il mio metodo web, per favore aggiusta il tuo codice di conseguenza. Assicurati che i tuoi nomi di proprietà della classe corrispondano a quelli di come quelli che passi attraverso 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; 
      } 
     }); 
    }); 

Classe

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

Web Service Called


enter image description here

si può afferrare il progetto da here. Inoltre, si prega di utilizzare Fiddler o Chrome per monitorare le richieste/risposte AJAX. Ho aggiunto un'immagine per mostrare come monitorare le richieste AJAX utilizzando Chrome. Fiddler è ancora migliore e più dettagliato.


enter image description here

+0

Grazie, è stato molto utile e vedo cosa stavo facendo male. Nel mio caso, non stava avendo il webmethod statico (a differenza di farlo in WCF) e con una sintassi JSON.Stringify errata. –

+0

Grazie mille! –

Problemi correlati