将JavaScript对象反序列化为Dictionary<string, string>通过Web API中的Model

Deserialize a JavaScript object as Dictionary<string, string> via ModelBinding in Web API

本文关键字:string 通过 Web API Model 中的 JavaScript Dictionary 对象 反序列化      更新时间:2023-09-26

我有一个简单的JavaScript字符串和对象:

var name = "Scarlett Johansson";
var args = { arg1: "foo", arg2: "bar" };

我想通过$.ajax传递它们到Web API控制器:

public string Get([FromUri]TestClass input) {
    // would like Args model-bound 
}
我的TestClass是:
public class TestClass
{
    public string Name { get; set; }
    public Dictionary<string, string> Args { get; set; }
}

Name属性按预期绑定,但我还没有找到绑定Args的方法。我试过JSON.stringify(args), $.param(args),在TestClass上使用List<KeyValuePair<string,string>>而不是Dictionary,没有任何作用。

我希望我可以通过模型绑定来实现这一点,而不是手动反序列化JSON。这可能吗?

说明:键/值的数量在每次调用的"args"中会有所不同,因此我需要一个Dictionary

默认的模型绑定不会这样工作,它试图绑定到对象的公共属性。在本例中,您需要一个包含如下内容的类:

public class ArgClass
{
    public string Arg1 { get; set; }
    public string Arg2 { get; set; }
}
public class TestClass
{
    public string Name { get; set; }
    public List<ArgClass> Args { get; set; }
}

另一种选择,这似乎是你想要做的,是编写一个自定义模型绑定器,或者快速谷歌搜索出现这个DefaultDictionaryBinder似乎有人已经实现了

https://github.com/loune/MVCStuff/blob/master/Extensions/DefaultDictionaryBinder.cs

更新:刚刚意识到你正在使用web api,这是我猜略有不同。这里有一篇博客文章解释了绑定是如何为webapi工作的:http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

让我们用实现扩展你的方法(看看我们传递的结果),像这样:

public HttpResponseMessage Get([FromUri]TestClass input)
{
    return Request.CreateResponse<TestClass>(HttpStatusCode.OK, input);
}

如果我们想看这个:

{
 "Name":"MyName",
 "Args":
  {
   "FirstKey":"FirstValue",
   "SecondKey":"SecondValue"
  }
}

换句话说testClass.Name == "MyName"testClass.Args["FirstKey"] == "FirstValue"…我们可以这样调用API:

api/MyService/?name=MyName&args[0].key=FirstKey&args[0].value=FirstValue&args[1].key=SecondKey&args[1].value=SecondValue

分隔行上的参数,只是为了清晰(URI将没有换行符!):

api/MyService/
  ?name=MyName
  &args[0].key=FirstKey
  &args[0].value=FirstValue
  &args[1].key=SecondKey
  &args[1].value=SecondValue