2011-05-17 71 views
11

模型聯編程序是否不支持JSON對象數組?下面的代碼在將單個JSON域對象作爲ajax帖子的一部分發送時工作。但是,在發送JSON域對象數組時,action參數爲null。通過jQuery將JSON對象數組發送到MVC3操作方法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) 
{ 
    ... 

任何想法如果能夠做到這一點?

編輯

@Milimetric

你的解決方案的工作!但是,這是我的錯,但是我演示的代碼並不是我的問題的實際代碼,我試圖展示相當易於理解的代碼。

其實我創建一個數組,然後一些作用中的DOM元素,推動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-returns – ChrisF 2013-05-09 20:36:15

回答

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。

備註:剛剛發現了這一點。模型綁定上可空小數性質扼流圈,如:

public decimal? latitude { get; set; } 

所以不會綁定,如果你張貼到它與一個JSON字符串,看起來像這樣:

{"latitude":12.0} 

但它會

{"latitude":"12.0"} 

參見:http://syper-blogger.blogspot.com/2011/07/hello-world.html

+2

感謝您的回覆 - 和正確的解決方案,但我已經更新了我的問題 – jcvandan 2011-05-17 13:21:50

+2

K,編輯了我的答案,我認爲關鍵是JSON.stringify和contentType:「application/json ...」 – Milimetric 2011-05-17 13:38:12

+1

working - 你絕對的傳奇! – jcvandan 2011-05-17 13:43:27

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'時,這特別有用, – 2012-08-16 15:28:27

相關問題