ASP.NET MVC POST方法未接收JSON字典

时间:2017-04-12 17:35:32

标签: c# asp.net json asp.net-mvc asp.net-mvc-4

我有一个移动应用程序发布到我的ASP.NET MVC 4 HttpPost方法,每次收到数据时,它都没有收到正确的数据。

[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,参数是带有一个密钥{J}的JSON编码字典,newItems,值是字典数组([["user": "testUser1", "itemNumber": "123-45678"], ["user": "testUser2", "itemNumber": "456-7890"]]

我在POST方法中设置了try / catch块来捕获任何错误。当方法发布到时,它会进入catch块并告诉我newItemsDictionary参数中不存在“ newItem ”键。参数中存在的密钥为:actioncontroller。操作键和控制键不包含任何值。

为什么会发生这种情况,我应该更改哪些内容才能获得正确的数据?

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为请求模型绑定适用于Dictionary,因此,如果您期望使用Dictionary,则可能会处理请求本身。

您应该将字典更改为ViewModel或您可以使用的内容。对于IE:

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

然后,您发布了一个UserItemViewModel列表。

答案 1 :(得分: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.
     }
}