Передача параметра в функцию JavaScript в виде объекта Dictionary - PullRequest
1 голос
/ 20 сентября 2010

Пожалуйста, помогите мне понять следующую часть кода из поста Запрос поста JavaScript как форму отправки

function post_to_url(path, params, method) {
....
for(var key in params) {
    var hiddenField = document.createElement("input");
    hiddenField.setAttribute("type", "hidden");
    hiddenField.setAttribute("name", key);
    hiddenField.setAttribute("value", params[key]);

    form.appendChild(hiddenField);
}
....

Означает ли это, что мы можем передать объект Dictionary в функцию JavaScript (вызывая функцию JavaScript из приложения Silverlight), и она сгенерирует строку параметра в виде key=value&key2=value2&key3=value3?

Например, передав следующий словарь:

Dictionary<string, decimal> postdata = new Dictionary<string, decimal>();
postdata["productID1"] = 126504;
postdata["productID2"] = 126505;

Получаем вывод функции: productId1=126504&productId2=126505?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Зависит от того, что вы подразумеваете под выводом. Функция не выводит ничего напрямую. Он создает форму и добавляет элемент ввода для каждой пары ключ-значение в объекте. Затем он отправляет эту форму, и браузер внутренне генерирует эту строку параметров и отправляет ее по URL-адресу. Если под выводом вы имеете в виду «сообщения на сервер», то да - это то, что он делает.

Что касается передачи объектов из управляемого кода (silverlight), кажется, что это возможно. Dictionary s будет маршалироваться к объектам Javascript, пока ключ равен string. Вы сможете получить доступ к записям, используя обычную запись свойств javascript (dictionary["key"] или dictionary.key).

Дополнительная литература по поводу составления словаря.

Кроме того, я могу ошибаться (мой C # немного ржавый), но не будет:

Dictionary<string, decimal> postdata = new Dictionary<string, decimal>();
postdata["productID"] = 126504;
postdata["productID"] = 126505;

считать недействительным? В Dictionary s, как и в объектах Javascript, все ключи должны быть разными, нет?


Если вы просто хотите получить строку запроса, создание функции для создания параметра / строки запроса из объекта JS относительно просто.

Например:

function paramString(object) {
    var strBuilder = [];
    for (var key in object) if (object.hasOwnProperty(key)) {
       strBuilder.push(encodeURIComponent(key)+'='+encodeURIComponent(object[key]));
    }
    return strBuilder.join('&');
}

paramString(postdata)
"productID1=126504&productID2=126505"
1 голос
/ 20 сентября 2010

Каждый объект java-script реализован в виде словаря - все свойства являются парами имя-значение.Таким образом, чтобы передать словарь в функцию post_to_url, вы можете использовать

var postdata = {};
postdata["name1"] = value1;
postdata["name2"] = value2;
...

post_to_url(url, postdata, "post"

Обратите внимание, что синтаксис postdata["name1"] и postdata.name1 эквивалентны - они ссылаются на одно и то же значение.Вы также можете использовать альтернативный синтаксис, используя обозначение объекта JS.Например,

var postdata = {
    "name1" = value1,
    "name2" = value2,
    ...
    "namex" = valuex
};

post_to_url(url, postdata, "post"

Теперь, чтобы ответить на другую часть вашего вопроса - зрячая функция JS будет публиковать только данные из параметров.Он не будет создавать URL, такой как productId=126504&productId=126505 для метода GET.Для этого вам нужно свернуть собственную версию, такую ​​как

function post_to_url(path, params, method) {
    method = method || "post"; // Set method to post by default, if not specified.
// The rest of this code assumes you are not using a library.
// It can be made less wordy if you use one.
var form = document.createElement("form");
form.setAttribute("method", method);
form.setAttribute("action", path);

for(var key in params) {

    if (method.toUpperCase() === "GET") {
       if(path.indexOf("?") < 0) {
           path += "?";
       }
       path += "&" + key + "=" + params["key"];
    }
    else {

       var hiddenField = document.createElement("input");
       hiddenField.setAttribute("type", "hidden");
       hiddenField.setAttribute("name", key);
       hiddenField.setAttribute("value", params[key]);

       form.appendChild(hiddenField);
    }
}

document.body.appendChild(form);    // Not entirely sure if this is necessary
form.submit();

}

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