我有一个用 System.Web.Script.Services.ScriptService()装饰的ASP.NET Web服务,因此它可以返回json格式的数据。这对我很有帮助,但是ASP.Net要求Web服务的参数必须在json中以便让json出来。
我正在使用jquery来运行我的ajax调用,似乎没有一种简单的方法可以从表单元素创建一个漂亮的 javascript对象。我查看了json2库中的serialiseArray,但它没有将字段名称编码为对象中的属性名称。
如果您有2个这样的表单元素
<input type="text" name="namefirst" id="namefirst" value="John"/>
<input type="text" name="namelast" id="namelast" value="Doe"/>
调用 $(“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
<WebMethod()> _
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方法,将查询字符串解析为关联数组。
<WebMethod()> _
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 / script服务?
答案 0 :(得分:2)
你只是在制造格式化危机。
要正确调用此代码:
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
您需要发送一个如下所示的json字符串:
'{"nvp": {"name": "john", "value": "foo"}}'
不要使用jQuery来序列化ScriptService参数。使用标准json2.js。
试试这个: 表格
...
<input type="text" name="name" id="name" value="John"/>
<input type="text" name="value" id="value" value="Foo"/>
...
脚本:
var myNvp = {name: $('#name').val(), value:$('#value').val()};
var data = JSON.stringify({nvp: myNvp});
// data is what you post to the service.
我只是把它写在了我的头顶,但它看起来对我来说。
如果您有任何其他问题,请告诉我。
答案 1 :(得分:-1)
我没有找到比将序列化字符串作为参数传递更好的方法。
输入:
{"q":"namefirst=John&namelast=Doe"}
web服务:
<WebMethod()> _
Public Function AjaxForm(ByVal q As String) as string
Dim params As NameValueCollection = HttpUtility.ParseQueryString(q)
'do stuff
return "Hello"
End Sub
这似乎是最干净,最简单的选择