2010-09-20 3 views
1

Пожалуйста, помогите мне понять следующую часть кода с поста JavaScript post request like a form submitПередача параметра в функции 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), и он будет генерировать строку param в форме 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

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

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

More reading относительно словарь marshalling.

Кроме того, я могу ошибаться (мой 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" 
+0

Да, Даниил, спасибо.Я исправлю себя – rem

+0

@rem: Если эта строка - все, что вам нужно, я добавил функцию, которая возвращает это на основе объекта JS (или словарь из SL, который я предполагаю). –

+0

@ Даниэль Благодарим вас за помощь и за этот пример, это наверняка даст мне больше понимания JavaScript. Но в моем случае я хотел бы, чтобы функция JavaScript генерировала несколько «входных» элементов в соответствии с количеством элементов в словаре. Как и в случае идентичных атрибутов «имя входа» в сообщении http://stackoverflow.com/questions/3747222/javascript-post-request/3749631#3749631, тогда я получу в строке требуемую строку – rem

1

Каждый объект Java-скрипт реализован в виде словаря - все свойства пары имя-значение. Таким образом, чтобы передать словарь 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 будет только отправлять данные из Params. Он не будет создавать 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(); 

}

Смежные вопросы