请帮助我理解帖子JavaScript post request like a form submit
中代码的以下部分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函数(从Silverlight app调用JavaScript函数),它将以key=value&key2=value2&key3=value3
的形式生成param字符串?
例如,传递以下词典:
Dictionary<string, decimal> postdata = new Dictionary<string, decimal>();
postdata["productID1"] = 126504;
postdata["productID2"] = 126505;
我们得到函数输出:productId1=126504&productId2=126505
?
答案 0 :(得分:2)
取决于输出的含义。该函数不直接输出任何内容。它创建一个表单,并为对象中的每个键值对添加一个输入元素。然后它提交该表单,浏览器在内部生成该参数字符串并将其POST到URL。如果输出你的意思是“发布到服务器”,那么是 - 这就是它的作用。
关于从托管代码(silverlight)传入对象,似乎有可能。只要密钥是Dictionary
,string
将被编组到Javascript对象。您可以使用常规的javascript属性表示法(dictionary["key"]
或dictionary.key
)来访问这些条目。
另外,我可能错了(我的C#有点生疏),但不会:
Dictionary<string, decimal> postdata = new Dictionary<string, decimal>();
postdata["productID"] = 126504;
postdata["productID"] = 126505;
被视为无效?在Dictionary
中,与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 :(得分: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的数据。对于GET方法,它不会为productId=126504&productId=126505
创建一个URL。为此,您需要汇总自己的版本,例如
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();
}