2011-11-08 70 views
7

我有一個jQuery ajax調用,其中我試圖發送可從複選框表中選擇的用戶的int ID。MVC與jQuery Ajax調用不正確綁定空數組/枚舉

我遇到問題,沒有用戶被選中。我期望一個空數組,但事實上,我收到一個長度爲1的數組,其中包含userId 0(即未分配的int值)。

下面的代碼片段重現問題

$('#test').click(function() { 
    var numbers = $('.noElements').map(function() { 
     // (selector does not match any elements, to demonstrate) 
     return 1; 
    }).get(); 

    $.ajax({ 
     url: '/MyController/Test', 
     type: "GET", 
     data: { numbers: numbers, count: numbers.length } 
    }); 
}); 


public ActionResult Test(IEnumerable<int> numbers, int count) 
{ 
    Assert(numbers.Count() == count); 
    return null; 
} 

斷言失敗,因爲numbersList<int> { 0 }。爲什麼綁定發生像這樣?

+0

代碼是有點混亂,要設置編號爲「1」,即numbers.Count ()是1.但理想情況下,當沒有用戶被選中時,numbers.Count()應該是理想的「0」。然後它的斷言失敗了。它是否正確 ? –

+0

你可以在你的動作方法中嘗試下面的改變,看看它是否有效。用IList替換IEnumerable。看看它是否有效,如果是的話,那麼我會爲這篇文章添加一個詳細的答案。 –

+0

Numbers是1的0長度數組。從「IEnumerable」變爲「IList」不會有什麼區別。 – fearofawhackplanet

回答

1

我相信默認的模型聯編程序會將通過jQuery AJAX調用傳遞給它的空字符串轉換爲包含一個包含整數(0)默認值的單個元素的整數數組。如果你不喜歡的東西這個 -

$('#test').click(function() { 
    var numbers = $('.noElements').map(function() { 
     return 1; 
    }); 
    if (numbers.length == 0) { 
     numbers = null; 
     count = 0; 
    } 
    else count = numbers.length; 

    $.ajax({ 
     url: '/Home/Test', 
     type: "GET", 
     data: { numbers: numbers, count: count } 
    }); 
}); 

有關進一步信息和替代解決方案這個問題,你的代碼會工作 - How to post an empty array (of ints) (jQuery -> MVC 3)

+0

是的,它看起來像MVC中沒有支持傳遞一個空數組。多麼奇怪。我不知道他們的推理是以這種方式實施的,反正我不會立即明白。 – fearofawhackplanet

+0

其實,我不得不刪除我的答案,因爲在我的情況下,即使非空數組以不正確的方式序列化(mvc2) – Bartosz