2011-02-10 77 views
1

在一個MVC控制器的POST中,我使用JQuery發送一個具有兩個屬性的JSON對象:Id和Foos。出於某種原因,每個FooModel實例的所有屬性都是空/空的。asp.net mvc json解串器不工作

這裏的方法:

[HttpPost] 
public ActionResult EditFoo(int Id, FooModel[] foos) 

這是我的小提琴手,獲取表單參數(我可以證實,該數據被傳遞到服務器)。我還用兩個調試器驗證了JSON對象包含所有正確的值。

Id        17934 
Foos[0][Label]     My Foo 
Foos[0][Bars][0][Label]  First Bar 
Foos[0][Bars][0][Id]   1 
Foos[0][Bars][1][Label]  Second Bar 
Foos[0][Bars][1][Id]   2 

FooModel看起來像這樣:

public class FooModel 
{ 
    public string Label { get; set; } 
    public IList<Bar> Bars { get; set; } 
} 

在EditFoo方法,我可以看到的富項目的權限編號的數組(在該例子中,1)。但是,每個FooModel實例中的所有屬性都是空/空的。

編輯1:

爲了澄清:我不是手工創建表單參數。我通過ajaxArgs.data傳遞一個真正的JSON對象回到$ .ajax()。

表單數據本身看起來像這樣:

Id=17934&Foos%5B0%5D%5BId%5D=1&&Foos%5B0%5D%5BLabel%5D=My+Foo... 

我不能找到一個快速的方式來獲得JSON本身作爲一個字符串,但是這是分配給ajaxArgs.data(該FOOS變量其所有屬性):

var data = { Id: Model.Id, Foos: Model.Foos }; 

編輯2:

我使用JavaScriptSerializer創建低於喜歡的字符串:

public static string ToJson(this object obj) 
    { 
     var serializer = new JavaScriptSerializer(); 
     var foo = serializer.Serialize(obj); 
     return foo; 
    } 

,然後讓模型在這樣的視圖可用於JavaScript:

<script type="text/javascript"> 
    var Model = <%= Model.ToJson() %>; 
</script> 

回答

2

問題是,默認的模型聯編程序不能理解您所顯示的請求。您請求的值應該是這樣的:

Id       17934 
Foos[0].Labe     My Foo 
Foos[0].Bars[0].Label  First Bar 
Foos[0].Bars[0].Id   1 
Foos[0].Bars[1].Label  Second Bar 
Foos[0].Bars[1].Id   2 

,或者如果你正在使用ASP.NET MVC 3 JSON請求廠家提供您可以發送這樣的JSON請求:

$.ajax({ 
    url: '/foo', 
    type: 'POST', 
    data: JSON.stringify({ 
     Id: 17934, 
     Foos: [ 
      { 
       Bars: [ 
        { Label: 'First Bar', Id: 1 }, 
        { Label: 'Second Bar', Id: 2 } 
       ] 
      } 
     ] 
    }), 
    contentType: 'application/json', 
    success: function(result) { 
     alert('success');  
    } 
}); 

應該發送如下請求:

{ Id: 17934, Foos: [ { Bars: [ { Label: 'First Bar', Id: 1 }, { Label: 'Second Bar', Id: 2 } ] } ] } 
0

您使用括號不正確。這:

Foos[0][Bars][0][Label] 

應該是這樣的:

Foos[0].Bars[0].Label 

而且,這不是JSON,他們是表單POST參數。

+0

這就是Fiddler如何表示參數。我會得到一個JSON示例 – 2011-02-10 21:50:14

+0

@c_bit,是的,我確信這就是Fiddler代表他們的方式,但也是因爲這是他們被傳送過來的方式。 jQuery允許您使用各種機制通過AJAX發送數據,包括POST *和* JSON兩種形式。您明確使用表單POST變體,並且對於ASP.NET MVC模型聯編程序,名稱/值對的**名稱**部分格式不正確。 – 2011-02-10 21:52:08