多种发布类型 asp.net 5 MVC 6 API
Multiple Posted Types asp.net 5 MVC 6 API
我可以将 [FromBody] 用于单个类型,但是有什么方法可以使用多个吗?
我搜索和阅读都没有找到方法,但我不知道 MVC 6 中是否添加了方法。
如果没有,最好从哪里开始自定义方式。
在模型绑定之前,我应该研究和寻找最好的方法或地方来挂钩什么,以便我可以包含我自己的方法?
最好的方法是创建复合包装器:
public class Wrapper
{
public ModelA A { get; set; }
public ModelB B { get; set; }
}
将Wrapper放在参数列表中并标记[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");
}
}
您也可以使用 Tuple
,它会为您提供参数列表中指定的具体类型。如果您的客户端始终是 .NET 应用程序(特别是 .NET 4.0 或更高版本),这会很棒,但是如果您尝试来自 AJAX,您可能想要编写一个帮助程序库来获取正确的有线格式或类似的东西。
我可以将 [FromBody] 用于单个类型,但是有什么方法可以使用多个吗?
我搜索和阅读都没有找到方法,但我不知道 MVC 6 中是否添加了方法。
如果没有,最好从哪里开始自定义方式。
在模型绑定之前,我应该研究和寻找最好的方法或地方来挂钩什么,以便我可以包含我自己的方法?
最好的方法是创建复合包装器:
public class Wrapper
{
public ModelA A { get; set; }
public ModelB B { get; set; }
}
将Wrapper放在参数列表中并标记[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");
}
}
您也可以使用 Tuple
,它会为您提供参数列表中指定的具体类型。如果您的客户端始终是 .NET 应用程序(特别是 .NET 4.0 或更高版本),这会很棒,但是如果您尝试来自 AJAX,您可能想要编写一个帮助程序库来获取正确的有线格式或类似的东西。