2010-05-07 71 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