ASP.Net JSON Web服务发布表单数据

时间:2010-05-07 00:31:01

标签: asp.net jquery ajax json web-services

我有一个用 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服务?

2 个答案:

答案 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

这似乎是最干净,最简单的选择