使用Dictionary作为属性路由的输入参数

时间:2016-03-08 13:03:36

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

我对MVC项目有以下RESTful Action:

[Route("save")]
[HttpPut]
public ActionResult UpdateAllSettings(Dictionary<string,object> values){}

目前我无法向该Action发送值。我尝试使用以下JSON-Structure:

fancyData="'values':[{'key':'k1','value':'v1'}]";
$http({url:'myurl',data: fancyData}

但值始终为空。

我还尝试将Dictionary<string,object>替换为List<KeyValuePair<string,object>>,结果相同

2 个答案:

答案 0 :(得分:2)

您必须告诉操作在请求正文中查找数据:

public ActionResult UpdateAllSettings([FromBody]Dictionary<string,object> values){}

答案 1 :(得分:0)

在这种情况下,最好使用values属性修饰FromBody参数。这样做的好处是,在创建PUT请求时,您可以将JSON - 内容添加为请求的内容。

httpClient.PutAsync("URL", new StringContent("YOUR JSON HERE",
                                             Encoding.UTF8,
                                             "application/json"));

为了获得更好的可重用性,只需从StringContent派生并创建一个JSONContent类:

public sealed class JsonContent : StringContent
{
    public JsonContent(object content)
        : base(JsonConvert.SerializeObject(content))
    {
    }

    public JsonContent(object content, Encoding encoding)
        : base(JsonConvert.SerializeObject(content), encoding, "application/json")
    {
    }
}
  

注意我使用Json.NET作为JSON库

现在您可以将其修改为:

httpClient.PutAsync("URL", new JsonContent(yourDictionaryHere,
                                           Encoding.UTF8,
                                           "application/json"));