【问题标题】:I can't pass more than one parameter to ASP Web API我不能将多个参数传递给 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 参数

标签: c# jquery asp.net-web-api


【解决方案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 email{get;set;}
          public string title{get;set;}
          public string body{get;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 解决方案,效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2012-06-11
    • 1970-01-01
    • 2020-11-09
    • 2016-10-28
    • 2018-09-03
    • 2019-05-14
    相关资源
    最近更新 更多