2013-07-16 36 views
2

我有一個JSON對象是這樣的:爲什麼modelbinder在ASP.NET MVC4中爲我的列表實例化空對象?

var itemData = { 
    "translations":[ 
     { 
     "value":"Byron", 
     "languageId":1    
     }, 
     { 
     "value":"hgfdfghds", 
     "languageId":3 
     } 
    ], 
    "itemId":204, 
    "itemCategoryId":44 
}; 

,我又把它使用jQuery像這樣的職位:

$.ajax({ 
    url: "items/update", 
    dataType: "json", 
    type: "POST", 
    data: itemData, 
}); 

當呼叫到達我的ASP.NET MVC4控制器動作,非列表屬性被分配。但是,translations數組只有兩個空對象(實例化,但具有空值/默認屬性值)。這裏是我的控制器的操作方法和我的模型:

public JsonResult Update(UpdateItemModel model) 
{ 
    if(model.Translations[0].Value!="Byron") 
    { 
     throw new Exception("That translation's value should have been populated with 'Byron'."); 
    } 
    return Json("ok"); 
} 

public class UpdateItemModel 
{ 
    public List<TranslationModel> Translations { get; set; } 
    public int ItemId { get; set; } 
    public int ItemCategoryId { get; set; } 
} 

public class TranslationModel 
{ 
    public string Value { get; set; } 
    public int LanguageId { get; set; } 
} 

如果我在即時窗口看Request.Form,我可以看到translations「陣列」編碼某種原因(也許這是正確的,不知道)。如果我嘗試Request.Form["translations"],我會得到null。下面是我看到的原始表單數據的例子:

{translations%5b0%5d%5bvalue%5d=Byron&translations%5b0%5d%5blanguageId%5d=1&translations%5b1%5d%5bvalue%5d=hgfdfghds&translations%5b1%5d%5blanguageId%5d=3&itemId=204&itemCategoryId=44}

不知道如果我的問題有什麼用了JSON「編碼」在那個字符串的開頭。我在Fiddler看着它,看到了同樣的事情,所以我不能責怪ASP.NET篡改。

這裏有什麼問題?

回答

3

應指定內容類型(JSON),並使用JSON.stringify

$.ajax({ 
    url: "items/update", 
    dataType: "json", 
    contentType: "application/json; charset=utf-8;", 
    type: "POST", 
    data: itemData, 
    data: JSON.stringify(itemData), 
}); 

另一件事做字符串化是使用添加JsonValueProviderFactory

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 
Application_Start方法

Global.asax

article可能會幫助你。

+1

該問題已修復,但未添加jsonValueProviderFactory。內容類型和數據串化是訣竅。謝謝! –

+0

很高興我幫了忙。乾杯。 – LeftyX

0

我可以看到json對象的屬性不匹配.net屬性,在json中你有.net中的「value」值「value」的情況是不同的。嘗試使的情況下進軍.NET模型

+0

我希望這不是原因,因爲沒有別的區分大小寫,但我會嘗試。 :) –

+0

不,同樣的問題。我將所有c#屬性更改爲camel-case,並且數組仍然填充了空對象。 –

1

當你通過數據Ajax調用好指定的內容和stringfy數據:

$.ajax({ 
    /*More stuff*/ 
    data: JSON.stringify(itemData), 
    contentType: 'application/json', 
    dataType: "json", 
    type: "POST" 
}); 

則該值提供商和默認模型綁定器將完成這項工作。

+1

#1不正確。在ASP.NET MVC中建模時,屬性名稱不區分大小寫。 #2是正確的,我需要contentType並將我的數據串聯起來。 –

+0

謝謝!我不知道這個改變! – Fals

相關問題