2010-05-07 4 views
1

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

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

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

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

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 текст внутри другого объекта nameed невирапина сделайте веб-сервис счастливым. Тогда его больше работает как все, что у вас есть, это массив NameValuePair, когда вам нужен ассоциативный массив.

я мог бы быть, шутите себя, но я представлял себе что-то более изящное, когда я начал этот проект - более как этот

Public Class Person 
    Public namefirst As String 
    Public namelast As String 
End Class 

, который потребует JSON выглядеть примерно так:

{"namefirst":"John","namelast":"Doe"} 

Is есть простой способ сделать это? Очевидно, что это просто для формы с двумя параметрами, но когда у вас очень большая конкатенация строк, становится уродливой. Вложенные объекты также усложнят вещи

В тот момент, на котором я остановился, используется стандартный формат пары значений имени, заполненный внутри объекта 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 

Как далеко cludges идти это, кажется, достаточно элегантный с точки зрения количества кода, но мой вопрос: есть ли лучший способ? Существует ли общепринятый способ передачи данных формы в службы asp.net web/script?

ответ

-1

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

вход:

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

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

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», я, вероятно, должен был поместить его в блок кода. –

+0

То, что я пытаюсь избежать, это строка: var myNvp = {name: $ ('# name'). Val(), value: $ ('# value'). Val()}; Представьте это с 30 элементами формы, он становится уродливым быстро, особенно с точки зрения обслуживания. Вы должны поддерживать как элементы ввода формы, так и javascript, который делает объект, который чисто там для помощника при вызове веб-службы, не добавляет никакого значения. Добавление новых элементов управления вводами больше связано с отсутствием прямой ссылки между формой и пост-данными, вы должны вручную создать объект javascript, который, по моему мнению, является более крупным, чем тот, который я начал с –

+0

@Will - используйте данные плагин. Есть несколько, которые будут читать вашу форму в любой форме JSOB, которая вам нравится. Суть в том, что есть правильный путь и неправильный способ делать то, что вы пытаетесь сделать. Один способ работает, а другой нет. Выбор ваш. ;-) –