【问题标题】:Error: Action has more than one parameter bound from request body错误:动作从请求正文绑定了多个参数
【发布时间】:2018-12-19 15:31:01
【问题描述】:

我在我的 ASP.Net MVC 项目的控制器中编写了一个新方法,并在下面出现错误。我认为 InvalidOperationException 来自 Swagger。我将其标记为“忽略的 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: Action 'Gorilla.WebApi.Source.Controller.Campaigns.BeverageCapacityCampaignController.CalculatePriceWithCampaign (Gorilla.WebApi)' 有多个参数被指定或推断为从请求正文绑定。每个动作只能从正文绑定一个参数。检查以下参数,并使用“FromQueryAttribute”指定从查询绑定,“FromRouteAttribute”指定从路由绑定,并使用“FromBodyAttribute”指定从正文绑定的参数:
BeverageCapacityCampaign 活动
饮料容量

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

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

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

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

    BeverageCapacityCampaign 
    BeverageCapacity 
    

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

    所以你需要要么

    1. 将它们组合成一个类,该类只包含/保存两个参数 作为属性 - 并将它们从主体绑定(作为一个对象)
    2. 决定哪个从body绑定,哪个从body绑定 路由或查询并将属性 [FromRoute] 或 [FromQuery] 添加到一个,并将 [FromBody] 添加到另一个。

    来自System.Web.Http.DescriptionApiExplorerSettings 将忽略帮助页面中的属性化操作,或其他任何内容(可能是大摇大摆)...但您仍然会遇到此异常 - 来自模型绑定级别的问题

    【讨论】:

      【解决方案2】:

      我的控制器有一些重构代码,其方法标记为公开。看起来要么将它们移出控制器或将它们标记为私有可以解决此问题。或者使用[NonAction] 归因于讨厌的方法也可能是asp.net Core mvc hide and exclude Web Api Controller Method 提出的一种选择

      【讨论】:

        【解决方案3】:

        为我在定义一个新的控制器时自动添加这个先决条件。
        我删除了它,它可以工作

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

        【讨论】:

          【解决方案4】:

          我收到错误“指定了多个参数...”,因为在类的顶部提到了 [ApiController],然后从 APIController 继承了类。

          通过从 Controller 继承类来纠正问题。

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

              [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 正确识别案例并生成有效的客户端代码。

              【讨论】:

                猜你喜欢
                • 2021-04-22
                • 2021-09-01
                • 1970-01-01
                • 2014-03-22
                • 1970-01-01
                • 2020-12-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多