2

我有一个简单的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), 使用List<KeyValuePair<string,string>>onTestClass而不是Dictionary, 没有任何效果。

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

澄清:键/值的数量会因调用而异,因此我需要字典。

4

2 回答 2

1

默认模型绑定不会那样工作,它会尝试绑定到对象的公共属性。在这个例子中,你需要一个包含类似的类:

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,我猜这略有不同。这是一篇博客文章,解释了绑定如何用于 web api:http: //blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

于 2013-06-07T11:42:52.763 回答
0

让我们通过实现来扩展您的方法(以查看我们通过的结果),如下所示:

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

如果我们想看到这个:

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

换句话说,testClass.Name == "MyName"and 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
于 2013-06-07T17:45:08.783 回答