Я не могу передать более одного параметра в ASP Web API - PullRequest
1 голос
/ 18 апреля 2019

Я пытался передать более одного параметра со стороны клиента с помощью 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"

Ответы [ 2 ]

4 голосов
/ 18 апреля 2019

Если вы отправляете данные в виде JSON, тогда все данные должны содержаться в единой связной структуре JSON. Наличие двух отдельных входных параметров на стороне сервера не соответствует этой концепции.

В этой ситуации вы можете создать DTO (Data Transfer Object), который является классом, содержащим все элементы, которые вы хотите перенести. Примерно так:

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(),
  }
}),

Это очень похоже на концепцию наличия ViewModel в MVC.

1 голос
/ 18 апреля 2019

Вам нужно добавить атрибут [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){}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...