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?
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. –
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 –
@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. ;-) –