简体   繁体   中英

I can't pass more than one parameter to ASP Web API

I tried to pass more than one parameter from client-side using jQuery to ASP Web API method, but the method can't accept that. I tried some of the solutions but the same thing.

Web 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);
        });

Error Message:

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

If you're sending the data as JSON then all the data needs to be contained in a single coherent JSON structure. Having two separate input parameters on the server side does not fit with this concept.

In this situation you can create a DTO (Data Transfer Object) which is a class holding all of the items you want to transfer. Something like this:

public class EmailMessageDTO
{
  public Email email { get; set; }
  public Message message { get; set; }
}

Then you define the action method as accepting this single over-arching object

public async Task<IHttpActionResult> SendMessage(EmailMessageDTO dto) { } 

And in the JavaScript:

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

It's quite similar to the concept of having a ViewModel in MVC.

You need to add [FromBody] attribute to parameter and you need to make post data to application/x-www-form-urlencoded and you send only email parameter, you need to add message parameter if you wanna send title and body you need to create model like model:

public class EmailSendModel(){
      public string email{get;set;}
      public string title{get;set;}
      public string body{get;set;}
}

controller:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM