2017-04-12 37 views
0

我有一個移動應用程序發佈到我的ASP.NET MVC 4 HttpPost方法,並且每次它接收到數據時,它都沒有收到正確的數據。ASP.NET MVC POST方法不接收JSON字典

[HttpPost] 
public void NewItems(Dictionary<string, List<Dictionary<string, string>>> newItemsDictionary) 
{ 
} 

我有我的RouteConfig設置如下:

routes.MapRoute(
      name: "Default", 
      url: "{action}", 
      defaults: new { controller = "API", action = "Index" } 
     ); 

移動應用被張貼到URL https://api.test.com/NewItems和參數是JSON編碼字典一個鍵,newItems和值是字典陣列([["user": "testUser1", "itemNumber": "123-45678"], ["user": "testUser2", "itemNumber": "456-7890"]]

我有一個嘗試/ catch塊設置內POST方法來捕獲任何錯誤。當該方法發佈時,它會進入catch塊並告訴我在newItemsDictionary參數中不存在「newItem」密鑰。參數中存在的鍵爲:actioncontroller。操作和控制器鍵不包含任何值。

爲什麼會發生這種情況,爲了接收正確的數據我應該改變什麼?

+0

您的NewItems參數嚴重混亂。您需要將javascript對象結構與parmater匹配,然後您可以調用對象的json.stringify以序列化爲json。 – Botonomous

回答

1

發生這種情況是因爲請求模型綁定與Dictionary配合工作,因此,如果您期待Dictionary,您可能會處理請求本身。

您應該將字典更改爲ViewModel或您可以使用的東西。對於IE:

public class UserItemViewModel 
{ 
    public string User { get; set; } 
    public string ItemNumber { get; set; } 
} 

然後,您發佈UserItemViewModel的列表。

+0

OP狀態參數爲([[「user」:「testUser1」,「itemNumber」:「123-45678」],[「user」:「testUser2」,「itemNumber」:「456-7890」]])將是通過json傳遞參數的正確格式。 – Botonomous

+1

OP可以嘗試像這樣'NewItems(List newItems)',我不能確定沒有測試。 – Win

+0

我無法使用視圖模型。數據不會通過任何類型的Web應用程序進入。它由一個移動應用程序發佈。 – Sicypher

1

爲什麼您需要等待一個需要以容易出錯的方式處理的對象列表Dictionary

如果將請求映射到strongly typed對象將會好得多。

public class ItemsViewModel 
{ 
    public string user; 
    public string itemNumber; 
} 

那麼你的API方法將如下所示:

[HttpPost] 
public void NewItems(List<ItemsViewModel> newItems) 
{ 
    foreach(var item in newItems){ 
     item.user... // And so on. 
    } 
}