将JavaScript对象反序列化为Dictionary通过Web API中的Model
本文关键字:string 通过 Web API Model 中的 反序列化 对象 Dictionary JavaScript | 更新日期: 2023-09-27 18:17:34
我有一个简单的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