2016-09-16 2 views
1

У меня есть следующие методы в Repository классанескольких параметров, проходящих с перегрузкой методы в WEB API

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; 

     } 

    } 

Тогда я пытаюсь получить эти два метода отдельно в 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); 
     } 
    } 

Здесь первый метод работая нормально, но как я могу обработать сценарий с множественными параметрами

enter image description here

+0

ли разделенные запятой вещь {идентификатор, имя} даже возможно? Любые ссылки на это? –

ответ

0

Я не уверен, возможно ли это {id,name}. Вы получаете исключение, потому что rou Модуль тин читает 5, тест, как один атрибут и не может сериализовать его в целое для метода

public IHttpActionResult GetBooksPriceById(int id)

Вы должны изменить свои методы, как показано ниже с учетом обнуляемых типов (интермедиат?), а также изменить маршрут

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

Ссылка - https://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx

+0

Я пробовал свой подход, но здесь получаю исключение, когда id == null http://imgur.com/a/pTPLI – kez

+0

обновлен с помощью типов с нулевым значением –

+0

благодаря его успеху :) – kez

0

Установите параметр как nullable типа, как показано ниже:

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

     public decimal findBookPrice(int book_id=0) 
     { 
      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=0, string bookname=null) 
     { 
      var bookprice = (
          from book in context.Books 
          where book.Book_Id == book_id & book.Book_Title == bookname 
          select book.Price 
          ).FirstOrDefault(); 

      return bookprice; 

     } 

    } 

и поставил условие, чтобы просто проверить nullable параметр, как показано ниже:

if(book_id!=0) 
{ 
    // do your logic here 
} 
if(!string.IsNullOrEmpty(bookname)) 
{ 
    // do your logic here 
} 

Надеется, что это поможет вам

Благодаря

Смежные вопросы