Search code examples
c#asp.net-coreasp.net-core-webapi

ASP.NET Core: [FromQuery] usage and URL format


I am trying to use [FromQuery] in my web API and I am not sure how to use it.

Here's the GetAllBooks() method in the controller:

 [HttpGet]
 [Route("api/v1/ShelfID/{shelfID}/BookCollection")]
 public async Task<IActionResult> GetAllBooks(string shelfID, [FromQuery] Book bookinfo)
 {
     //do something
 }

Here's the Book model class:

 public class Book
 {
     public string ID{ get; set; }
     public string Name{ get; set; }
     public string Author { get; set; }
     public string PublishDate { get; set; }
 }

I am confused about whether it is the correct way to use [FromQuery]. I thought the URL is

https://localhost:xxxxx/api/v1/ShelfID/{shelfID}/BookCollection/IActionResult?ID="123"&Name="HarryPotter"

But the break point is not hitting my controller method, so I was thinking maybe the URL is not correct. Any suggestions? Thanks!


Solution

  • The name of the method and return type are completely ignored when you define your route explicitly via attributes like that. IActionResult shouldn't be there.

    The correct URL would be: https://localhost:xxxxx/api/v1/ShelfID/{shelfID}/BookCollection?ID="123"&Name="HarryPotter"

    Furthermore, query string binding only works out of the box for primitive types (string, int, etc). To bind a class to a query string you'd need a custom modelbinder, which is quite involved.

    It would be better to just explicitly declare the properties you want to pass in:

    public async Task<IActionResult> GetAllBooks(string shelfID,
                                                 [FromQuery] string ID, 
                                                 [FromQuery] string Name)