2010-05-07 7 views
1

J'ai un service Web ASP.NET décoré avec System.Web.Script.Services.ScriptService() afin qu'il puisse renvoyer des données au format json. Cela fonctionne beaucoup pour moi, mais ASP.Net a besoin que les paramètres du service web soient en json afin de sortir de la base.ASP.Net Service Web JSON Publier des données de formulaire

J'utilise jquery pour exécuter mes appels ajax et il ne semble pas y avoir un moyen facile de créer un nice objet javascript à partir des éléments de formulaire. J'ai regardé serialiseArray dans la bibliothèque json2 mais il n'encode pas les noms de champs comme nom de propriété dans l'objet.

Si vous avez 2 éléments de formulaire comme celui-ci

<input type="text" name="namefirst" id="namefirst" value="John"/> 
<input type="text" name="namelast" id="namelast" value="Doe"/> 

appelant $ (le "formulaire"). Serialize() vous obtiendrez la chaîne de requête standard

namefirst=John&namelast=Doe 

appelant JSON. stringify ($ ("form"). serializeArray()) vous obtiendrez la représentation (encombrante) json

[{"name":"namefirst","value":"John"},{"name":"namelast","value":"Doe"}] 

Cela fonctionnera lors du passage au service Web, mais son laid que vous devez avoir un code comme celui-ci à lire dans:

Public Class NameValuePair 
    Public name As String 
    Public value As String 
End Class 
<WebMethod()> _ 
Public Function GetQuote(ByVal nvp As NameValuePair()) As String 

End Function 

Vous auriez aussi envelopper ce texte JSON dans un autre objet nameed NVP rendre le service web heureux. Ensuite, c'est plus de travail car tout ce que vous avez est un tableau de NameValuePair quand vous voulez un tableau associatif.

je pourrais être moi-même plaisantais mais j'imaginé quelque chose de plus élégant quand j'ai commencé ce projet - plus comme celui-ci

Public Class Person 
    Public namefirst As String 
    Public namelast As String 
End Class 

qui nécessiterait l'JSON pour ressembler à quelque chose comme ceci:

{"namefirst":"John","namelast":"Doe"} 

Est il y a un moyen facile de le faire? Évidemment, il est simple pour une forme avec deux paramètres mais quand vous avez une forme très grande, la concaténation des chaînes devient moche. Avoir des objets imbriqués compliquerait aussi les choses

Le cludge sur lequel je me suis arrêté pour le moment consiste à utiliser le format de paire de valeurs de nom standard bourré à l'intérieur d'un objet json. C'est compact et rapide

{"q":"namefirst=John&namelast=Doe"} 

ont alors une méthode Web comme celui-ci sur le serveur qui analyse la chaîne de requête dans un tableau associé.

<WebMethod()> _ 
Public Function AjaxForm(ByVal q As String) as string 
    Dim params As NameValueCollection = HttpUtility.ParseQueryString(q) 
    'do stuff 
    return "Hello" 
End Sub 

En ce qui concerne un cludges aller celui-ci semble assez élégant en termes de quantité de code, mais ma question est la suivante: est-il une meilleure façon? Existe-t-il un moyen généralement accepté de transmettre des données de formulaire aux services web/script asp.net?

Répondre

-1

Je n'ai rien trouvé de mieux que ce que je pensais déjà en passant la chaîne sérialisée en paramètre.

entrée:

{"q":"namefirst=John&namelast=Doe"} 

webservice:

<WebMethod()> _ 
Public Function AjaxForm(ByVal q As String) as string 
    Dim params As NameValueCollection = HttpUtility.ParseQueryString(q) 
    'do stuff 
    return "Hello" 
End Sub 

Cela semble l'option la plus propre et la plus simple

2

Vous venez d'avoir une crise de formatage.

Pour appeler correctement ce code:

Public Class NameValuePair 
    Public name As String 
    Public value As String 
End Class 
<WebMethod()> _ 
Public Function GetQuote(ByVal nvp As NameValuePair()) As String 

End Function 

Vous devez envoyer une chaîne JSON qui ressemble à ceci:

'{"nvp": {"name": "john", "value": "foo"}}' 

Ne pas utiliser jQuery pour sérialiser arguments de ScriptService. Utilisez la norme json2.js.

Essayez ceci: formulaire

... 
<input type="text" name="name" id="name" value="John"/> 
<input type="text" name="value" id="value" value="Foo"/> 
... 

Script:

var myNvp = {name: $('#name').val(), value:$('#value').val()}; 
var data = JSON.stringify({nvp: myNvp}); 
// data is what you post to the service. 

Je viens d'écrire ce du haut de ma tête, mais il semble juste pour moi. Informez-moi si vous avez d'autres questions.

+0

merci pour votre réponse - je mentionne qu'il devrait être enveloppé d'un objet "NVP", je devrais probablement l'avoir mis dans le bloc de code. –

+0

Ce que j'essaie d'éviter est cette ligne: var myNvp = {nom: $ ('# nom'). Val(), valeur: $ ('# value'). Val()}; Imaginez cela avec 30 éléments de forme, ça devient vite moche surtout d'un point de vue de la maintenance. Vous devez maintenir à la fois les contrôles d'entrée de formulaire et le javascript qui fait l'objet, qui purement là pour aider à l'appel au webservice, il n'ajoute aucune valeur. L'ajout de nouveaux contrôles d'entrée est plus impliqué car il n'y a pas de lien * direct * entre formulaire et post-données, vous devez former l'objet javascript manuellement, ce qui je pense est plus gros que celui que j'ai commencé avec –

+0

@Will - utiliser une donnée brancher. Il y en a plusieurs qui liront votre formulaire dans n'importe quelle forme JSOB que vous aimez. En bout de ligne, il y a une bonne et une mauvaise façon de faire ce que vous essayez de faire. Une façon fonctionne et l'autre ne fonctionne pas. Le choix t'appartient. ;-) –

Questions connexes