данные параметров массива getJSON в ashx - PullRequest
0 голосов
/ 13 октября 2011

У меня проблемы с передачей параметра массива моему обработчику .ashx. Параметры строки запроса работают нормально, но я не знаю, как получить доступ к массиву из файла ashx.

Мой массив - это список строк с именем list. Вот как я вызываю метод getJSON:

jQuery.getJSON('Handlers/AccessoryUpdateHandler.ashx?action=updateselection&a=' + a_sku, function (list) {
            //...
        });

В AccessoryUpdateHandler.ashx я могу получить параметр строки запроса, используя context.Request.QueryString["a"];

Но как мне получить данные массива? Я посмотрел на объект Request.QueryString, но там нет ничего похожего на мой массив.

Если есть лучший способ сделать это, мне также было бы интересно узнать.

Ответы [ 2 ]

0 голосов
/ 13 октября 2011

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

Используя get, наиболее идиоматическим способом является использование одного и того же параметра несколько раз.например,

Handlers/AccessoryUpdateHandler.ashx?a=1&a=2&a=55

Фактически в большинстве сред (исключение .NET), когда вы получаете параметр из URL, вы получаете возврат массива (часто с одним элементом)

Мое предложение - это выразбор контекста.Request.RawUrl

0 голосов
/ 13 октября 2011

Возможно, вам не следует полагаться на QueryString для передачи данных.Я бы посоветовал вам использовать метод «POST» вместо.В любом случае, используя подход, который вы используете, вы не сможете передать данные в виде массива.Преобразуйте массив в строку.Утилита типа stringify () может пригодиться, если вы не хотите преобразовывать массив в строку вручную.Когда вы извлекаете строку из Request.QueryString или Request.Form (если вы используете post) в обработчике, вы можете легко использовать JavaScriptSerializer для десериализациииспользуя простой класс C #, который имеет схему, аналогичную вашему массиву json.

Отредактировано: Иллюстрация

Массив наподобие

var ary = [{ "id": "1", "name": "Mark" }, { "id": "2", "name": "John"}];

может быть преобразован в строку типа:

var aryS = "[{\"id\":\"1\",\"name\":\"Mark\"},{\"id\":\"1\",\"name\":\"Mark\"}]";

тогда ваша QueryString может быть сконструирована как:

jQuery.getJSON('Handlers/AccessoryUpdateHandler.ashx?action=updateselection&a=' + aryS, function (list) {
        //...
    });

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

class Rec 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

с последним десериализацией:

string s = context.Request.QueryString["a"]; // HttpContext context
var jserializer = new JavaScriptSerializer();
var ary = jserializer.Deserialize<Rec[]>(s);

Обратите внимание, что вы должны использовать Rec [] в функции десериализации, поскольку вы десериализуете в массив. ary будет массивом Rec со всеми вашими данными из вашего массива javascript.Вам нужно сослаться на System.Web.Extensions, чтобы использовать JavaScriptSerializer

EDIT:

Я думал, что вы говорите о массиве объектов.Если это просто массив длиной * * с, то должно быть достаточно следующих строк:

string s = context.Request.QueryString["a"]; // HttpContext context
var jserializer = new JavaScriptSerializer();
var ary = jserializer.Deserialize<long[]>(s);

и вам не нужно создавать класс.это понадобится вам, только если у вас есть массив объектов json

...