你可以将一个匿名对象作为json发布到webapi方法中,并且它将json对象的属性与webapi调用的参数相匹配吗?

本文关键字:对象 json webapi 属性 调用 参数 一个 方法 | 更新日期: 2023-09-27 18:08:38

我可以有一个webapi方法吗

[Route("someroute")]
public void SomeMethod(string variable1, int variable2, Guid variable3)
{
     //... Code here
}
json

简单

var jsonvariable = new {
    variable1:"somestring",
    variable2:3,
    variable3: {9E57402D-8EF8-45DE-B981-B8EC201D3D8E}
}

然后让post

HttpClient client = new HttpClient { BaseAddress = new Uri(ConfigurationManager.AppSettings["SomeURL"]) };
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.PostAsJsonAsync("someroute", jsonvariable ).Result

来自javascript,我可以做这样的事情,它解决了单个属性,但我似乎不能用c#调用

var postData = {
     appUniqueId: appUniqueId
};
$http
   .post('someurl', postData)
   .success(function(response) {
      defer.resolve(response.data);
   });
webapi method
SomeWebMethod(Guid appUniqueId) <-- same name as in postdata

你可以将一个匿名对象作为json发布到webapi方法中,并且它将json对象的属性与webapi调用的参数相匹配吗?

你不能像在那里那样去做。

正如在注释和本文中提到的,您可以只使用一个 FromBody参数作为您的方法。因此,这些参数中的一个或一个都不会从JSON主体绑定。如果其中任何一个,它可能是它试图绑定的向导,因为它涉及到web api参数绑定规则。

你怎么解决这个问题?创建一个类来描述你的数据。

public class SomeBodyParameters
{
     public string variable1 { get; set; } 
     public int variable2 { get; set; } 
     public Guid variable3 { get; set; } 
} 

那么你的api方法看起来像这样:

[Route("someroute")]
public void SomeMethod([FromBody]SomeBodyParameters parameters)
{
     //... Code here
}

规定是它不会根据类型自动绑定,而是根据您在示例匿名类型中设置的名称进行绑定。Variable1、variable2和variable3的名称必须在两个位置上匹配。

当你考虑它时,那个看起来像JSON的匿名类型实际上是在传递一种对象,所以这就是你应该接受回来的东西。

发人深思:你如何区分一个简单的"字符串"和一个具有单一字符串的对象,比如var jsonvariable = new { variable1:"somestring"}; ?你基本上不能,这两个可能不应该等同。