将JavaScript对象反序列化为Dictionary<string, string>通过Web API中的Model
Deserialize a JavaScript object as Dictionary<string, string> via ModelBinding in Web API
我有一个简单的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
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 无法在通过jQuery的ajax加载的页面中执行javascript
- 如何通过ajax刷新JSF填充的javascript变量
- 通过javascript重定向html传递php变量
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 通过Magento的网络服务检索运费
- 无法通过数组映射绑定
- 通过单击表单中的按钮,在代码生成中使用javascript生成字母数字代码
- 通过js在新选项卡中有条件地打开url
- 如何使用jquery处理php循环通过元素
- 通过Ajax将JavaScript函数传递给PHP文件
- jquery动画可以通过编程链接吗
- 通过在Dojo mobile ViewController.openExternalView中动态更改打开同一外部视图的
- 如何通过数组更新角度子范围
- 如何通过php页面将数据库值检索到jquery自动完成框中
- 通过php页面中的js强制下载txt
- 我想使用模态通过php文件发送邮件,并且我希望在提交关闭后关闭pop
- 通过CSV文件上载更新数据库表
- 发送Map<字符串,List< String>比;通过ajax作为请求参数
- 通过套接字发送电子文件.io-stream失败'TypeError: Invalid non-string/bu