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

Dan*_*tin 6 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

InvalidOperationException:操作'Gorilla.WebApi.Source.Controller.Campaigns.BeverageCapacityCampaignController.CalculatePriceWithCampaign(Gorilla.WebApi)'具有多个参数,这些参数已从请求正文中指定或推断为绑定。每个动作只能绑定一个参数。检查以下参数,并使用'FromQueryAttribute'指定从查询绑定的边界,'FromRouteAttribute'指定从路由绑定的边界,以及'FromBodyAttribute'用于从body绑定的参数:
BeverageCapacityCampaignCampaign广告系列
BeverageCapacity容量

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

No *_*rns 14

我的控制器有一些重构的代码,其方法被标记为公共。看起来要么将它们移出控制器或标记为私有才能纠正此问题。或者将讨厌的方法归因于[NonAction]也可能是一个选择,如asp.net Core mvc hide and except Web Api Controller Method中所要求的那样


小智 11

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

[Route("api/[controller]")]
[Apicontroller] //remove this line
Run Code Online (Sandbox Code Playgroud)


Mem*_*per 9

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

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

BeverageCapacityCampaign 
BeverageCapacity 
Run Code Online (Sandbox Code Playgroud)

默认模型绑定复杂的参数从所述主体结合的请求的。但是,每个动作只能从body绑定一个参数

所以你需要

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

ApiExplorerSettingsfrom System.Web.Http.Description将忽略帮助页面或其他任何原因(也许是大摇大摆)的归因动作...但是您仍然会遇到此异常-来自模型绑定级别的问题