2011-05-17 21 views
11

モデルバインダーはJSONオブジェクトの配列をサポートしていませんか?以下のコードは、ajaxポストの一部として単一のJSONドメインオブジェクトを送信するときに機能します。ただし、JSONドメインオブジェクトの配列を送信する場合、actionパラメータはnullです。JSONオブジェクトの配列をMVC3アクションメソッドにjQuery ajax経由でポストする

 var domains = [{ 
         DomainName: 'testt1', 
         Price: '19.99', 
         Available: true 
        }, { 
         DomainName: 'testt2', 
         Price: '15.99', 
         Available: false 
        }]; 

       $.ajax({ 
        type: 'POST', 
        url: Url.BasketAddDomain, 
        dataType: "json", 
        data: domains, 
        success: function (basketHtml) { 

        }, 
        error: function (a, b, c) { 
         alert('A problem ocurred'); 
        } 
      }); 

これは、アクションメソッドである:これを行うことが可能である場合

public ActionResult AddDomain(IEnumerable<DomainBasketItemModel> domain) 
{ 
    ... 

任意のアイデア?

EDIT

@Milimetric

あなたのソリューションの作品!しかし、これは私のせいですが、私が実証したコードは私の問題の本当のコードではなく、わかりやすい同等のコードを表示しようとしていました。

私は実際に、その後いくつかのDOM要素をinteratingし、データとしてこの配列を掲示、アレイにJSONオブジェクトを押して、配列を作成しています...

var domains = []; 

       $(this).parents('table').find('input:checked').each(function() { 
        var domain = { 
         DomainName: $(this).parent().parent().find('.name').html(), 
         Price: $(this).parent().parent().find('.price span').html(), 
         Available: $(this).parent().parent().find('.available').html() == "Available" 
        } 

        domains.push(domain); 
       }); 

       $.ajax({ 
        type: 'POST', 
        url: Url.BasketAddDomain, 
        dataType: "json", 
        data: { domain: domains }, 
        success: function (basketHtml) { 

        }, 
        error: function (a, b, c) { 
         alert('A problem ocurred'); 
        } 
       }); 
+0

関連 - http://stackoverflow.com/questions/2515773/ajax-post-of-javascript-string-array-to-jsonresult-as -liststring-always-reply – ChrisF

答えて

31

は次のものが必要です。

var domains = { domains: [... your elements ...]}; 

      $.ajax({ 
       type: 'post', 
       url: 'Your-URI', 
       data: JSON.stringify(domains), 
       contentType: "application/json; charset=utf-8", 
       traditional: true, 
       success: function (data) { 
        ... 
       } 
      }); 

一般に、デバッガのRequestオブジェクトをチェックすると、何が渡されているかがわかり、HTTPを "話す"方法がわかります。

注::ちょうどこれを見つけました。モデルバインダーは次のようにnull許容のDecimalプロパティにチョーク:

public decimal? latitude { get; set; } 

だから、結合しないこと、あなたはこのようになりますJSON文字列でそれを投稿している場合:

{"latitude":12.0} 

しかし、それはWILL

{"latitude":"12.0"} 

参照:http://syper-blogger.blogspot.com/2011/07/hello-world.html

+2

返信ありがとう - 正解ですが、私の質問が更新されました – jcvandan

+2

Kは私の答えを編集しました。鍵はJSON.stringifyとcontentTypeです: "application/json ..." – Milimetric

+1

は働いていました - あなたは絶対伝説! – jcvandan

1

あなたはこのような何かを投稿した場合に動作私も同様の問題がありました。それを解決するために、少し違ったアプローチをとった。 JSONオブジェクトの代わりに、隠れたフォーム変数の配列を使用しました。変数名が一致する限り、モデルバインディングは魅力的に機能しました。

function AddDomainBasket(domainName, price, available) { 

    if (typeof AddDomainBasket.counter == 'undefined') { 
     AddDomainBasket.counter = 0; 
    } 

    $("#some_form").append('<input type="hidden" name="[' + AddDomainBasket.counter + '].DomainName" value="' + domainName_index + '" />'); 
    $("#some_form").append('<input type="hidden" name="[' + AddDomainBasket.counter + '].Price" value="' + price + '" />'); 
    $("#some_form").append('<input type="hidden" name="[' + AddDomainBasket.counter + '].Available" value="' + available + '" />'); 

    ++AddDomainBasket.counter; 
} 

そしてserlializedフォームに提出

$(this).parents('table').find('input:checked').each(function() { 
    AddDomainBasket($(this).parent().parent().find('.name').html(), 
        $(this).parent().parent().find('.price span').html(), 
        $(this).parent().parent().find('.available').html() == "Available"); 
       } 
      }); 

$.ajax({ 
    type: 'POST', 
    url: Url.BasketAddDomain, 
    data: $('#some_form').serialize(), 
    success: function (basketHtml) { 
     }, 
     error: function (a, b, c) { 
      alert('A problem ocurred'); 
    } 
}); 
+1

+1これは、コンテンツタイプを 'application/json'に設定したくない場合に特に便利です。 –

関連する問題