Данные формы публикации веб-службы ASP.Net JSON - PullRequest
1 голос
/ 07 мая 2010

У меня есть веб-сервис ASP.NET, украшенный System.Web.Script.Services.ScriptService () , поэтому он может возвращать данные в формате json.У меня это работает, но ASP.Net требует, чтобы параметры веб-службы были указаны в json для вывода json.

Я использую jquery для выполнения моих вызовов ajax и нене кажется простым способом создать хороший объект javascript из элементов формы.Я посмотрел на serialiseArray в библиотеке json2, но он не кодирует имена полей как имена свойств в объекте.

Если у вас есть 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"}]

Это будет работать при переходе на веб-сервис, но это уродливо, так как вам необходим код, подобный этому, для чтения:

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, чтобы сделать веб-сервис счастливым.Тогда вам больше всего нужно работать с массивом 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?

Ответы [ 2 ]

2 голосов
/ 07 мая 2010

У вас просто кризис форматирования.

Чтобы правильно вызвать этот код:

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 голосов
/ 11 мая 2010

Я не нашел ничего лучше, чем я думал о передаче сериализованной строки в качестве параметра.

ввод:

  {"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

Это кажется самым чистым и простым вариантом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...