2012-04-21 3 views
5

ho scoperto che il mio webmethod sta tornando datiPerché i dati del servizio web di ritorno come msg.d

{ "d": 
[ 
    {"id":"1","itemtxt":"Masters"}, 
    {"id":"2","itemtxt":"Transactions"}, 
    {"id":"3","itemtxt":"Misch. Reports"} 
] 
} 

Se si nota, la matrice è chiamato come "d". Perché ? c'è qualche regola per questo?

Per vostra informazione Sto tornando un elenco di oggetti (List<webitem>)

public class webitem 
{ 
    public webitem(string kid, string kval) 
    { 
     this.id = kid; 
     this.itemtxt = kval; 
    } 

    public string id { get; set; } 
    public string itemtxt { get; set; } 
} 

Che cosa significa questo "d" significa? sarà sempre uguale per tutti i dati che invio dal mio webmethod? o cambierà a seconda del mio tipo di dati/tipo di classe?

EDIT

Ecco la webmethod

[WebMethod] 
public List<webitem> GetSubModules(string key) 
{ 
    string s = " order by smid"; 
    if (key != null) 
     s = " where moduleid=" + key + s; 
    return Utility.GetDDLVal("Select smid id,smname itemtxt from m_submodules "+s, null, null); 
} 
+1

non riesco a vedere alcun '' ritorno ... codice – gdoron

+0

Aggiornato il WebMethod con il codice di ritorno – Deb

risposta

5

E 'un po' una caratteristica di sicurezza come parte di ASP.NET. Sarà sempre lì finché non cambierai i serializzatori. Il blog di David Ward (ora defunto) ha detto di cosa si tratta:

Questo è il caso con tutti i servizi ASMX serializzati JSON tramite le estensioni ASPJNET AJAX in ASP.NET 3.5. Anche se si restituisce solo un valore di ritorno scalare, come una stringa, int o booleano, il risultato sarà sempre racchiuso all'interno della "d".

E il perché:

{ "d": 1}

non è una dichiarazione JavaScript valida, dove come questo:

[1]

Is .

Quindi il wrapping del parametro "d" impedisce l'esecuzione diretta della stringa come script. Nessuna preoccupazione per il costruttore di oggetti o array.

+0

grazie per la risposta e la grande link !! – Deb

+1

'{" d ": 1}' è perfettamente valido in JS - quindi per esempio '{" d ": console.log (" Do Evil ")}' esegue perfettamente in nodejs che è il problema di sicurezza che il tuo blog di riferimento sta spiegando che sta cercando di prevenire. Quindi, il wrapping ** non ** fornisce alcun problema di sicurezza. – Soren

+0

[Il commento di Dave Reed] (http://encosia.com/a-breaking-change-between-versions-of-aspnet-ajax/#comment-34045) nel post del blog collegato ha ancora più dettagli. – M4N