错误:操作与请求正文绑定了多个参数

时间:2018-12-19 15:31:02

标签: c# asp.net-mvc

我在ASP.Net MVC项目的控制器中写了一个新方法,并在下面出现错误。我认为InvalidOperationException来自Swagger。我将其标记为“ ignored Api”,希望它将跳过该方法,但仍然存在错误:

[ApiExplorerSettings(IgnoreApi = true)]
public decimal CalculatePriceWithCampaign(
       BeverageCapacityCampaign campaign, 
       BeverageCapacity capacity,
       int count = 1)
{
    switch (campaign.DiscountType)
    {
        case DiscountType.Fixed:
            return (capacity.CapacityPrice - campaign.DiscountValue) * count;
        case DiscountType.Percentage:
            return (capacity.CapacityPrice * count) * campaign.DiscountValue;
        default:
            return capacity.CapacityPrice;
    }
}

但是在运行时出现此错误:

  

处理请求时发生未处理的异常。

     

InvalidOperationException:操作'Gorilla.WebApi.Source.Controller.Campaigns.BeverageCapacityCampaignController.CalculatePriceWithCampaign(Gorilla.WebApi)'具有多个从请求正文中指定或推断出的参数。每个动作只能绑定一个参数。检查以下参数,并使用'FromQueryAttribute'指定来自查询的绑定,'FromRouteAttribute'指定来自路由的绑定,以及'FromBodyAttribute'指定从主体绑定的参数:   
BeverageCapacityCampaign广告系列   
饮料容量

我可以找到建议检查nuget的信息,但是我所有的Nu​​get都是最新的。

6 个答案:

答案 0 :(得分:4)

该错误来自模型绑定,与Swagger无关(ApiExplorerSettings属性的存在对错误没有影响。)

您有两个复杂的参数。即复杂类型

BeverageCapacityCampaign 
BeverageCapacity 

模型绑定默认从请求正文中绑定复杂参数。但是,每个动作只能绑定一个参数

因此您需要

  1. 将它们组合到一个只包装/保存两个参数的类中 作为属性-并使其与主体(作为一个对象)绑定
  2. 确定要与身体绑定的对象以及与之绑定的对象 路由或查询,并将属性[FromRoute]或[FromQuery]添加到一个,并将[FromBody]添加到另一个。
ApiExplorerSettings中的

System.Web.Http.Description将忽略帮助页面中的归因动作,或其他任何原因(可能是大招)...但是您仍然会遇到此异常-来自模型绑定级别的问题< / p>

答案 1 :(得分:2)

我的控制器有一些重构的代码,其方法被标记为public。看起来将它们移出控制器或标记为私有都可以解决此问题。或如asp.net Core mvc hide and exclude Web Api Controller Method

所述,将讨厌的方法归因于[NonAction]也可能是一个选择。

答案 2 :(得分:1)

对我来说,在定义新控制器时会自动添加此先决条件。
我删除了它,而且有效

[Route("api/[controller]")]
[Apicontroller] //remove this line

答案 3 :(得分:0)

另一种可能的解决方案是将复杂的数据类型嵌套在元组中:

[ApiExplorerSettings(IgnoreApi = true)]
public decimal CalculatePriceWithCampaign((BeverageCapacityCampaign campaign, BeverageCapacity capacity) data, int count = 1)
{
    switch (data.campaign.DiscountType)
    {
        case DiscountType.Fixed:
            return (data.capacity.CapacityPrice - data.campaign.DiscountValue) * count;
        case DiscountType.Percentage:
            return (data.capacity.CapacityPrice * count) * data.campaign.DiscountValue;
        default:
            return data.capacity.CapacityPrice;
    }
}

但是,NSwag(Swagger)似乎无法自动解析这种情况,因为生成了无效的示例。 NSwagStudio可以正确识别情况并生成有效的客户端代码。

答案 4 :(得分:0)

由于在类顶部提到了[ApiController],然后从APIController继承了类,因此收到错误消息“具有多个指定的参数...”。

通过从Controller继承类来解决问题。

[Authorize]
[Route("api/the")]
**[ApiController]**
public class TheController : **Controller**

答案 5 :(得分:0)

我是从BaseController而不是ControllerBase继承而得到此错误的。这是另一个库中的一个完全不相关的类,我记错了名字。对我来说是个例外。