2017-07-29 32 views
2

以下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"); 
    } 
}); 
+2

不是直接回答問題,但可以使用'JSON.stringify'並將它傳遞給一個JavaScript對象(例如'{LoadFileSeparator:...}'),以便您的代碼更具可讀性,你不得不手動構建你的JSON字符串。 –

+1

^^總是最好不要手動構建JSON。 (或XML等) –

+0

備註:「分隔符」一詞拼寫爲「分隔符」(在'p'後面的'a'),而不是「分隔符」。 –

回答

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:如果可以的話,郵寄的JSON,無法獲得:

$.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"); 
    } 
}); 

這就需要在服務器端的變化,雖然。

+1

不知道隱含的屬性名稱。涼! – pinkfloydx33

+0

@ pinkfloydx33:對不起,我應該叫他們「推斷」的屬性名稱(即JavaScript引擎推斷名稱)。 :-) –

+0

不管他們叫什麼,我都不知道他們。非常酷的任何一種方式。不幸的是,我的公司在遺產方面進行交易,這意味着我寫的大部分js都必須在ie8-10中工作,所以我不是最新的,因爲我真的很喜歡。所以總是很高興學習新的東西。 – pinkfloydx33