kez kez - 2 months ago 20
C# Question

multiple parameters passing with method overloading in WEB API

I have following methods in Repository Class

public class LibraryRepository : IBookRepository
{
LibraryContext context = new LibraryContext();

public decimal findBookPrice(int book_id)
{
var bookprice = (
from r in context.Books
where r.Book_Id == book_id
select r.Price
).FirstOrDefault();

return bookprice;

}

public decimal findBookPrice(int book_id, string bookname)
{
var bookprice = (
from book in context.Books
where book.Book_Id == book_id & book.Book_Title == bookname
select book.Price
).FirstOrDefault();

return bookprice;

}

}


Then I'm trying to get those two methods separately in Web API

public class BooksWithAuthersController : ApiController
{

private LibraryRepository db = new LibraryRepository();

// GET: api/BooksWithAuthers/id/Price

[ResponseType(typeof(decimal))]
[Route("api/BooksWithAuthers/{id}/Price")]
public IHttpActionResult GetBooksPriceById(int id)
{
decimal bookprice = db.findBookPrice(id);

return Ok(bookprice);
}

// GET: api/BooksWithAuthers/id,name/Price

[ResponseType(typeof(decimal))]
[Route("api/BooksWithAuthers/{id,name}/Price")]
public IHttpActionResult GetBooksPriceById(int id,string name)
{
decimal bookprice = db.findBookPrice(id,name);

return Ok(bookprice);
}
}


Here first method working fine, but How can I handle scenario with multiple parameters

enter image description here

Answer

I am not sure if this {id,name} is even possible.You are getting the exception because routing module is reading 5,test as single attribute and is not able serialize it to int for method

public IHttpActionResult GetBooksPriceById(int id)

You need to change your methods as below considering nullable types (int?) and also change the route

[ResponseType(typeof(decimal))]
[Route("api/BooksWithAuthers/{id}/Price")]
public IHttpActionResult GetBooksPriceById(int? id)
{
   decimal bookprice = db.findBookPrice(id);
   return Ok(bookprice);
}


[ResponseType(typeof(decimal))]
[Route("api/BooksWithAuthers/{id}/{name}/Price")]
public IHttpActionResult GetBooksPriceById(int? id,string name = null)
{
    decimal bookprice = db.findBookPrice(id,name);

    return Ok(bookprice);
}

Reference - https://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx