C# 多种发布类型asp.net 5 MVC 6 API

C# 多种发布类型asp.net 5 MVC 6 API,c#,asp.net,asp.net-mvc,asp.net-core,asp.net-core-mvc,C#,Asp.net,Asp.net Mvc,Asp.net Core,Asp.net Core Mvc,我可以将[FromBody]用于单个类型,但有没有办法使用多个 从我所做的搜索和阅读来看,没有一种方法,但我不知道MVC6中是否添加了一种方法 如果没有,最好从哪里开始定制 在模型绑定之前,我应该研究什么,寻找最好的方法或地方,以便包括我自己的方法 最好的方法是创建复合包装: public class Wrapper { public ModelA A { get; set; } public ModelB B { get; set; } } 将包装器放在参数列表中,并标记为[F

我可以将[FromBody]用于单个类型,但有没有办法使用多个

从我所做的搜索和阅读来看,没有一种方法,但我不知道MVC6中是否添加了一种方法

如果没有,最好从哪里开始定制


在模型绑定之前,我应该研究什么,寻找最好的方法或地方,以便包括我自己的方法

最好的方法是创建复合包装:

public class Wrapper
{
   public ModelA A { get; set; }

   public ModelB B { get; set; }
}

将包装器放在参数列表中,并标记为
[FromBody]
。您不能多次使用该属性,因为假定主体的所有内容都与参数类型匹配。

如果您可以轻松地在调用者和服务器之间共享模型,则复合包装方法非常有用,但更通用的方法是使用JObject:

using Newtonsoft.Json.Linq;  // this gets you to JObject

[Route("svc/[controller]/[action]")]
public class AccountController : Controller
{
  [HttpPost("{accountid}")]
  public IActionResult UpdateAccount(int accountid, [FromBody]JObject payload)
  {
    var loginToken = payload["logintoken"].ToObject<LoginToken>();
    var newAccount = payload["account"].ToObject<Account>();
    // perform update
    return this.Ok("success");
  }
}
使用Newtonsoft.Json.Linq;//这会让你找到JObject
[路由(“svc/[控制器]/[操作]”)
公共类AccountController:控制器
{
[HttpPost(“{accountid}”)]
public IActionResult UpdateAccount(int accountid,[FromBody]作业对象有效负载)
{
var loginToken=payload[“loginToken”].ToObject();
var newAccount=payload[“account”].ToObject();
//执行更新
返回这个。好(“成功”);
}
}

您可能还可以使用
元组
,它将为您提供参数列表中指定的具体类型。如果您的客户端始终是.NET应用程序(.NET 4.0或更高版本,尤其是),这将非常好,但是如果您试图使用AJAX或类似的工具,您可能希望编写一个帮助程序库以获得正确的wire格式。

是否无法连接到FromBody使用的相同函数?将主体拆分为两个标记值,如post值,然后执行类似的操作。[FromBody(“ModelA”)]ModelA[FromBody(“ModelB”)]ModelB B?到处搜索,看看是否有解决方案,似乎有些接近,但没有具体的解决方案。所以标记作为解决方案。。。任何想要进一步阅读的人。。。很接近,但需要更新到asp.net 5 mvc 6,可能很有用。如果不使用[FromBody],则可能会有多个值。如果您确实使用FromBody,Dave Ward指出您只能有一个,他说“说到我们的方法的参数,接受[FromBody]参数的另一个可能令人困惑的地方是,只能有一个。”