ASP.Net JSON Web服务发布表单数据
我有一个用System.Web.Script.Services.ScriptService()修饰的ASP.NET Web服务,因此它可以返回json格式的数据。 这对我很有帮助,但ASP.Net要求Web服务的参数必须在json中才能获得json。
我正在使用jquery来运行我的ajax调用,似乎没有一种简单的方法可以从表单元素创建一个漂亮的 javascript对象。 我在json2库中查看了serialiseArray,但它没有将字段名称编码为对象中的属性名称。
如果您有2个这样的表单元素
调用$(“form”)。serialize()将为您提供标准查询字符串
namefirst=John&namelast=Doe
调用JSON.stringify($(“form”)。serializeArray())会得到(庞大的)json表示
[{"name":"namefirst","value":"John"},{"name":"namelast","value":"Doe"}]
这将在传递给Web服务时起作用,但它很难看,因为你必须有这样的代码来读取它:
Public Class NameValuePair Public name As String Public value As String End Class _ Public Function GetQuote(ByVal nvp As NameValuePair()) As String End Function
您还必须将该json文本包装在另一个名为nvp的对象中,以使Web服务满意。 然后,当你想要一个关联数组时,你所拥有的就是一个NameValuePair数组。
我可能在开玩笑,但当我开始这个项目时,我想象一些更优雅的东西 – 更像是这样
Public Class Person Public namefirst As String Public namelast As String End Class
这需要json看起来像这样:
{"namefirst":"John","namelast":"Doe"}
是否有捷径可寻? 显然,对于具有两个参数的表单来说很简单,但是当你有一个非常大的表单时,连接字符串变得很难看。 嵌套对象也会使事情复杂化
我暂时解决的问题是使用填充在json对象中的标准名称值对格式。 这是紧凑和快速的
{"q":"namefirst=John&namelast=Doe"}
然后在服务器上有一个这样的Web方法,将查询字符串解析为关联数组。
_ Public Function AjaxForm(ByVal q As String) as string Dim params As NameValueCollection = HttpUtility.ParseQueryString(q) 'do stuff return "Hello" End Sub
到目前为止,这个问题在代码量方面似乎相当优雅,但我的问题是:有更好的方法吗? 是否有一种普遍接受的方式将表单数据传递给asp.net Web /脚本服务?
你只是在制造格式化危机。
要正确调用此代码:
Public Class NameValuePair Public name As String Public value As String End Class _ Public Function GetQuote(ByVal nvp As NameValuePair()) As String End Function
您需要发送一个如下所示的json字符串:
'{"nvp": {"name": "john", "value": "foo"}}'
不要使用jQuery来序列化ScriptService参数。 使用标准的json2.js 。
试试这个:表格
... ...
脚本:
var myNvp = {name: $('#name').val(), value:$('#value').val()}; var data = JSON.stringify({nvp: myNvp}); // data is what you post to the service.
我只是把它写在了我的头顶,但它看起来对我来说。
如果您有任何其他问题,请与我们联系。
我没有找到比我已经考虑过将序列化字符串作为参数传递更好的东西。
输入:
{"q":"namefirst=John&namelast=Doe"}
网络服务:
_ Public Function AjaxForm(ByVal q As String) as string Dim params As NameValueCollection = HttpUtility.ParseQueryString(q) 'do stuff return "Hello" End Sub
这似乎是最干净,最简单的选择