2011-08-18 53 views
1

我試圖解析一個簡單的guid /字符串數組到json json被用作後調用我的控制器的參數。解析一個字符串數組到MVC方法

我一直在嘗試很多不同的東西,但我只是不能讓控制器的方法看到我的列表。

該陣列由複選框值構建:

$('input:checkbox').click(function() { 
     if ($(this).attr("checked") == true) { 
      selected.push($(this).val()); 
     } 
    }); 

,看起來沒事。 然後我嘗試將其轉換成JSON

$(document).ready(function() { 
    $('#Summarize').click(function() { 
     var arrayJson = {}; 
     for (i in selected) { 
      arrayJson[i] = selected[i]; 
     } 
     var json = { 
      SelectedQuantities: arrayJson 
     }; 

     $.ajax({ 
      url: "/MVC/Physical/SelectQuantities/@Model.TopID", 
      type: "POST", 
      data: JSON.stringify(json), 
      dataType: "json", 
      contentType: 'application/json', 
      success: function (result) { 
       debugger; 
       if (result.status == 200) 
        location.replace = "/MVC/Physical/QuantitySummaryView/@Model.TopID" 
       else { 
        //Handle error 
       } 

      } 
     }); 
    }); 
}); 

我的控制器方法看起來如下:

public ActionResult QuantitySummaryView(Guid id, List<String> SelectedQuantities) 

不過這個名單總是空。我想這是因爲JSON列表不包含直接在它下面的GUID數組。

你能幫我把它推到原位嗎?

JSON(由鉻合金開發工具可以看到)看起來如下:

{ 
"SelectedQuantities": { 
    "0": "707c40bd-4434-41ed-80fd-4ac541a81e85", 
    "1": "a8d78a4b-b107-4e1c-97b5-5d8abf530ba8", 
    "2": "a19226cc-9b22-4174-97e3-bb003d4b2746" 
} 

}

+0

我不熟悉asp.net,但控制器期望參數來獲取一個列表,但你的jQuery發佈JSON字符串...不是一個列表。我會嘗試將參數列表 SelectedQuantities更改爲String SelectedQuantities並將json字符串轉換爲控制器中的LIst。希望幫助 – Cygnusx1

回答

1

我認爲你是一個序列化的次數太多了,你有一個層次過多。試試這個:

我刪除了一個SelectedQuantities,並更改ajax調用。

$(document).ready(function() { 
    $('#Summarize').click(function() { 
     var arrayJson = {}; 
     for (i in selected) { 
      arrayJson[i] = selected[i]; 
     } 

     var json = { 
      SelectedQuantities: arrayJson 
     }; 

     $.ajax({ 
      url: "/MVC/Physical/QuantitySummaryView/@Model.TopID", 
      type: "POST", 
      data: JSON.stringify(json), 
      dataType: "json", 
      contentType: 'application/json' 
     }); 
    }); 
}); 

另外,嘗試Firebug的,它會告訴你想傳遞給服務器,這樣就可以確保創建並通過JSON是正確的。

+0

嘗試執行此操作,但它仍然抱怨列表爲空。 我用編輯好的代碼更新了我的原始問題。你介意再看一遍嗎? – mfriis

+0

獎金信息。我可以通過使用$ .post而不是字符串化來實現它。但它不通過AJAX工作,也沒有或沒有stringify。 $ .POST( 「/ MVC/Physical/SelectQuantities/@Model.TopID」,JSON, 功能(數據){ location.href = 「/MVC/Physical/QuantitySummaryView/@Model.TopID」 } ); – mfriis

1

你並不需要字符串化JSON的你也不需要添加雙SelectedQuantities

$(document).ready(function() { 
    $('#Summarize').click(function() { 
     var arrayJson = {}; 
     for (var i in selected) { 
      arrayJson[i] = selected[i]; 
     } 

     var json = { 
      SelectedQuantities: arrayJson 
     }; 
     //json = JSON.stringify(json); 
     $.post("/Home/QuantitySummaryView/@Model.TopID", json, true); 
    }); 
}); 

然而,根據你的代碼,你將只能得到物品託運的數量(所有的人都平等到「打開」)您沒有任何代碼可以傳遞被檢查項目的名稱,也不會傳遞未檢查項目的名稱。所以你可能不得不改變你的代碼來處理名稱/值對。

+0

謝謝你:)這樣一個小但重大的錯誤。 我不需要名稱,我需要的只是指導。 – mfriis

0

例如:

其中包含的GUID的集合的模型:

<% var index = 1; %> 
    <% foreach(var guid in Model.Guids) { %> 
     <input type="checkbox" value="<%= guid %>" name="guid<%= index %>" /> 
    <%: guid %> 
    <br /> 
    <% index++; %> 
<% } %> 
<br /> 
<input type="button" value="Summarize" id="Summarize" />  

中的JavaScript/jQuery的:

public class GuidModel 
{ 
    public GuidModel() 
    { 
     Guids = new List<Guid>(); 

     Guids.Add(Guid.NewGuid()); 
     Guids.Add(Guid.NewGuid()); 
     Guids.Add(Guid.NewGuid()); 
     Guids.Add(Guid.NewGuid()); 
     Guids.Add(Guid.NewGuid()); 
    } 

    public IList<Guid> Guids { get; set; } 
} 

的複選框被視圖中呈現

<script type="text/javascript"> 
    var selected = []; 

    $('input:checkbox').click(function() { 
     if ($(this).attr("checked") == true) { 
      selected.push($(this).val()); 
     } 
    }); 

    $('#Summarize').click(function() { 
     var arrayJson = {}; 
     for (i in selected) { 
      arrayJson[i] = selected[i]; 
     } 

     var json = { 
      SelectedQuantities: arrayJson 
     }; 
     json = JSON.stringify(json); 

     $.post("/Home/QuantitySummaryView?data=" + json); 
    }); 
</script> 

控制器中的操作方法:

[HttpPost] 
public ActionResult QuantitySummaryView(string data) 
{ 
    // Deserialize the string containing JSON serialized data 
    JavaScriptSerializer jss = new JavaScriptSerializer();  
    //... 
}