我不能将多个参数传递给 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"
【问题讨论】:
创建一个具有Email
和Message
类型属性的模型类,然后发送该对象。
另外,在您的 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 方法
如何将多个参数传递给 ASP.NET Core 中的 get 方法