以下JQuery ajax调用工作正常。 它传递一个Json字符串作为参数。 正如我所说,这很好。 但是,如果LoadFileSeperator ='#'在服务器上的AJAXSettingsUpdate中收到JSON参数时会被截断。
如何对LoadFileSeperator进行编码,以便它不会截断JSON的任何值?
var jsonQuery = '{"LoadFileSeperator":"' + LoadFileSeperator + '",' +
'"MakeUpperCase":"' + MakeUpperCase + '",' +
'"PreAdviceGate":"' + PreAdviceGate + '",' +
'"PreAdviceRail":"' + PreAdviceRail + '",' +
'"PreAdviceBirth":"' + PreAdviceBirth + '"' +
'}';
$.ajax({
type: "GET",
url: "/Admin/AJAXSettingsUpdate?jsonstr=" + jsonQuery,
dataType: "json",
async: false,
success: function (result) {
if (result === "SUCCESS") {
TypeUpdateSuccess("Updated");
} else {
TypeUpdateFail("Failure");
}
},
error: function (x, e) {
showAlert("ERROR - " + e, "alert-danger");
}
});
答案 0 :(得分:2)
您正在执行GET
操作并将JSON转储到完全未编码的URL中。当然,它会在第一个无效的URI字符处被截断(#
用于引入URI的片段部分。)
您需要对URI中的任何内容进行URI编码:
url: "/Admin/AJAXSettingsUpdate?jsonstr=" + encodeURIComponent(jsonQuery)
旁注:作为John Weisz points out,手工构建JSON字符串容易出错且难以阅读。相反,构造要发送的结构,然后使用JSON.stringify
将其转换为JSON:
var jsonQuery = JSON.stringify({
"LoadFileSeperator": LoadFileSeperator, // Left original spelling here
"MakeUpperCase": MakeUpperCase,
"PreAdviceGate": PreAdviceGate,
"PreAdviceRail": PreAdviceRail,
"PreAdviceBirth": PreAdviceBirth
});
(在这种情况下,密钥周围的引号是可选的,因为所有这些密钥都是有效的标识符名称,但如果您的密钥不是有效的标识符名称,则包含它们是无害的。)
除了提高可读性之外,它还确保完成所有必要的转义。 (例如,如果这些变量中的任何一个包含"
或\
或换行符或其他任何字符,那么您最终会得到无效的JSON。)
在ES2015中,由于推断的属性名称,它会更简单:
// REQUIRES ES2015 SUPPORT
let jsonQuery = JSON.stringify({
LoadFileSeperator, // Left original spelling here
MakeUpperCase,
PreAdviceGate,
PreAdviceRail,
PreAdviceBirth
});
当您使用推断的属性名称时,JavaScript引擎会根据您为其值提供的变量的名称推断(计算出)该属性的名称。
附注2:如果可以,请通过POST发送JSON,而不是GET:
$.ajax({
type: "POST",
url: "/Admin/AJAXSettingsUpdate", // ***
dataType: "json",
contentType: "application/json", // ***
data: jsonQuery, // ***
async: false,
success: function(result) {
if (result === "SUCCESS") {
TypeUpdateSuccess("Updated");
}
else {
TypeUpdateFail("Failure");
}
},
error: function(x, e) {
showAlert("ERROR - " + e, "alert-danger");
}
});
但这需要在服务器端进行更改。