2010-05-07 72 views
1

我有一个ASP.NET Web服务装饰System.Web.Script.Services.ScriptService()因此它可以返回json格式的数据。这对我很有帮助,但ASP.Net有一个要求,即为了让json得到JSON,Web服务的参数必须在json中。ASP.Net JSON Web服务后表单数据

我正在使用jquery来运行我的ajax调用,并且似乎没有一种简单的方法来创建漂亮的 JavaScript对象从窗体元素。我已经看过json2库中的serialiseArray,但它不会将字段名称编码为对象中的属性名称。

如果你有2个表单元素这样

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

调用$( “形式”)。序列化()将让你的标准查询字符串

namefirst=John&namelast=Doe 

调用JSON。 stringify($(“form”)。serializeArray())将为您带来(笨重的)json表示

[{"name":"namefirst","value":"John"},{"name":"namelast","value":"Doe"}] 
0123传递到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 

你也必须到另一个对象nameed NVP内部的JSON文本换行到使网络服务开心。然后,当你想要一个关联数组时,你所拥有的更多工作就是一个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"} 

再有这样的网络方法解析查询字符串转换为关联数组服务器上。

<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 /脚本服务是否有普遍接受的方式?

回答

-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 

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

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. 

我只是写这离我的头顶,但它看起来我的权利。

让我知道如果您有任何其他问题。

+0

谢谢您的回答 - 我不提,那就需要用一个对象被包裹“nvp”,我可能应该把它放到代码块中。 – 2010-05-07 01:17:27

+0

我想避免的是这行: var myNvp = {name:$('#name')。val(),value:$('#value')。val()}; 想象这与30个表单元素,特别是从维护的角度来看它很快变得丑陋。您必须同时维护表单输入控件和生成该对象的JavaScript,纯粹是为了帮助调用web服务,它不会增加任何值。添加新的输入控件涉及更多,因为表单和发布数据之间没有* direct *链接,所以您必须手动创建javascript对象,我认为这比我以 – 2010-05-07 01:18:03

+0

开始的那个更合适@将使用数据插入。有几个将您的表单读入您喜欢的任何JSOB形状。底线是,有一种正确的方式和一种错误的方式来做你想做的事情。一种方法有效,另一种则不行。这是你的选择。 ;-) – 2010-05-07 01:31:24