我不能将多个参数传递给 ASP Web API

Posted

技术标签:

【中文标题】我不能将多个参数传递给 ASP Web API【英文标题】:I can't pass more than one parameter to ASP Web API 【发布时间】:2019-09-08 17:54:45 【问题描述】:

我尝试使用 jQuery 从客户端向 ASP Web API 方法传递多个参数,但该方法无法接受。我尝试了一些解决方案,但都是一样的。

网络 API:

[HttpPost]
[ResponseType(typeof(Message))]
[Route("api/Messages/send-message")]
public async Task<IHttpActionResult> SendMessage(Email email, Message message) 

jQuery:

   $.ajax(
       url: '/api/Messages/send-message',
       method: 'POST',
       contentType: "application/json; charset=utf-8",
       dataType: "json",
       data: JSON.stringify(
            email: EmailsArray,
            title: $('#txtTitle').val(),
            body: $('#txtContent').val(),
         ),
       success: function (response) 
           console.log(response);
        );

错误信息:

"message":"An error has occurred.","exceptionMessage":"Can't bind multiple parameters ('email' and 'message') to the request's content.","exceptionType":"System.InvalidOperationException"

【问题讨论】:

创建一个具有EmailMessage 类型属性的模型类,然后发送该对象。 另外,在您的 JS 中,您当前正在发送 三个 参数(电子邮件、标题和正文)而不是两个。在该数据对象中看不到“消息”。但是是的,只需将它们全部包装在 DTO 中......请参阅下面的答案 原生 WebAPI 不支持绑定多个 POST 参数 【参考方案1】:

如果您以 JSON 格式发送数据,则所有数据都需要包含在一个连贯的 JSON 结构中。在服务器端有两个单独的输入参数不符合这个概念。

在这种情况下,您可以创建一个 DTO(数据传输对象),它是一个包含您要传输的所有项目的类。像这样的:

public class EmailMessageDTO

  public Email email  get; set; 
  public Message message  get; set; 

然后您将操作方法​​定义为接受这个单一的总体对象

public async Task<IHttpActionResult> SendMessage(EmailMessageDTO dto)   

javascript 中:

data: JSON.stringify(
  email: EmailsArray,
  message:  
    "title": $('#txtTitle').val(),
    "body": $('#txtContent').val(),
  
),

这与 MVC 中拥有 ViewModel 的概念非常相似。

【讨论】:

【参考方案2】:

您需要将[FromBody] 属性添加到参数,并且您需要将发布数据发送到application/x-www-form-urlencoded,并且您只发送电子邮件参数,如果您想发送标题和正文,您需要添加消息参数,您需要创建模型,如 型号:

public class EmailSendModel()
      public string emailget;set;
      public string titleget;set;
      public string bodyget;set;

控制器:

[HttpPost]
[ResponseType(typeof(Message))]
[Route("api/Messages/send-message")]
public async Task<IHttpActionResult> SendMessage([FromBody]EmailSendModel model)

【讨论】:

“您需要将数据发布到 application/x-www-form-urlencoded” ...这不是绝对必要的,不。 Web API 将接受该格式或 JSON。 当输入参数为非原始类型时,不应需要 FromBody。 (我认为在 ASP.NET Core 中你可能必须设置它,但这个问题被标记为 ASP.NET 传统) 我之前尝试过 [FromBody],但没有成功。现在我尝试了上面的@ADyson 解决方案,效果很好。

以上是关于我不能将多个参数传递给 ASP Web API的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 vba 将参数传递给 asp.net web api?

在 ASP.NET C# 中使用 jQuery 将多个参数传递给 Web 方法

将多个参数传递给 Web API GET 方法

如何将多个参数传递给 ASP.NET Core 中的 get 方法

通过 javascript 将复杂参数传递给 Web API 服务

如何将多个参数传递给 ASP.NET CORE MVC 中的 HttpGet 方法?