天天看點

ajax traditional

代碼如下:

<script>
    $(function () {
        var s = Array("1", "2", "3");
        var r = 213123132;
        $.ajax({
            url: "/Home/Test",
            type: "POST",
            data: {
                "ss": s,
                "r": r
            },
            traditional: true,//這裡設定為true
            success: function (data) {
                //Todo
            }
        });
    });
    
</script>      

traditional: 阻止深度序列化

一般的,可能有些人在一個參數有多個值的情況下,可能以某個字元分隔的形式傳遞,比如頁面上有多個checkbox:

$.ajax{
      url:"xxxx",
      data:{
            p: "123,456,789"
      }
}           

    然後背景擷取參數後再分隔,這種做法有很大弊端,試問如果某一個參數值中出現了分隔符所使用的字元,會出現什麼情況呢?當然背景擷取的參數将與實際情況不符. 

   這時我想到了将上述代碼寫成這樣:

$.ajax{
      url:"xxxx",
      data:{
            p: ["123", "456", "789"]
      }
}           

    如果單純寫成這樣,在java背景是無法取到參數的,因為jQuery需要調用jQuery.param序列化參數, 

jQuery.param( obj, traditional )           

    預設的話,traditional為false,即jquery會深度序列化參數對象,以适應如PHP和Ruby on Rails架構, 

    但servelt api無法處理,我們可以通過設定traditional 為true阻止深度序列化,然後序列化結果如下:

p: ["123", "456", "789"]    =>    p=123&p=456&p=456           

    随即,我們就可以在背景通過request.getParameterValues()來擷取參數的值數組了, 

    是以,比如我們前台有多個checkbox,前台的代碼可以寫成: 

var values = $("input[type=checkbox]").map(function(){
      return $(this).val();
}).get();
$.ajax{
      url:"xxxx",
      traditional: true,
      data:{
            p: values 
      }
}           

The end