2011-11-08 2 views
7

jQuery ajax呼び出しで、チェックボックスのテーブルから選択できるユーザーのint IDを送信しようとしています。jQueryを使ったMVC Ajax呼び出しが空の配列/列挙体を正しくバインドしない

ユーザーが選択されていない場合に問題があります。空の配列が必要ですが、実際にはuserId 0(つまり、割り当てられていないint値)を含むlength = 1の配列を受け取ります。

次のスニペットは、numbersList<int> { 0 }であるため、アサートが失敗する問題

$('#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; 
} 

を再生します。なぜバインディングはこのように起こっていますか?

+0

コードは少し混乱して、あなたはすなわちnumbers.Count「1」に番号を設定している - あなたはthis-

$('#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 } }); }); 

さらに情報や代替ソリューションのため、この質問を参照してくださいのような何かをした場合あなたのコードは動作します()は1ですが、理想的には、ユーザーが選択されていない場合、numbers.Count()は理想的には「0」になります。そしてその時の主張は失敗しています。これは正しいです ? –

+0

アクションメソッドで次の変更を試して、それが動作するかどうかを確認できますか? IEnumerableをIListに置き換えます。それがうまくいくかどうかを見てください。そうすれば、私はこの投稿に詳細な回答を追加します。 –

+0

数値は0の長さの1の配列です。 'IEnumerable'から' IList'に変更しても違いはありません。 – fearofawhackplanet

答えて

1

デフォルトのモデルバインダーは、jQuery AJAX呼び出しによって渡される空の文字列を、デフォルト値の整数(0)を含む単一の要素を含む整数配列に変換すると考えています。 How to post an empty array (of ints) (jQuery -> MVC 3)

+0

空の配列を渡すためのサポートがMVCにないように見えます。おかしいですね。私は、彼らの推論がこのように実装された理由を疑問に思います。とにかく私にはすぐには分かりません。 – fearofawhackplanet

+0

実際、私の答えを削除しなければならなかったのは、私の場合、空でない配列が不適切な方法で直列化されたとしても(mvc2) – Bartosz

関連する問題