2014-11-13 2 views
0

Я создаю приложение angularJS с бэкэндом asp.net webapi. В моем файле routeeconfig у меня есть этоНастройка маршрутов asp.net webapi

routes.MapRoute(
    name: "default", 
    url: "{*url}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

Это прекрасно работает. Любой Url, который вызывается, возвращает представление Home/Index (единственное представление, которое у меня есть), и angularJS работает, если есть запрос и работает, какое состояние отображается.

У меня есть базовые методы Get, Put, Post и Delete в моем WebApi, и я могу назвать их точными. Примерами являются

public class CompanyController : ApiController 
{ 
    private CompanyService _service; 

    public CompanyController(CompanyService service) 
    { 
     _service = service; 
    } 

    public async Task<IHttpActionResult> Get() 
    { 
     ... 

     return Ok(model); 
    } 

    public async Task<IHttpActionResult> Get(int id) 
    { 
     ... 

     return Ok(model); 
    } 

    public async Task<IHttpActionResult> Post(CompanyModel model) 
    { 
     ... 

     return Ok(); 
    } 

    public async Task<IHttpActionResult> Put(Company model) 
    { 
     ... 

     return Ok(); 
    } 

    public async Task<IHttpActionResult> Delete(CompanyModel model) 
    { 
     ... 

     return Ok(); 
    } 
} 

Теперь я хотел бы добавить еще один метод к моему апи, где пользователь может загружать компании, но и пройти в срок для поиска (строки), PAGESIZE (целое) и страницы число (int). Что-то вроде этого

public async Task<IHttpActionResult> Get(string term, int page, int pageSize) { 
    ... 

    return Ok(results); 
} 

Теперь я понимаю, что мне нужно добавить еще один маршрут, чтобы убедиться, что этот метод можно назвать. Отлично, поэтому я добавляю это в свой RouteConfig.

// search 
routes.MapRoute(
    name: "search", 
    url: "api/{controller}/{page}/{pageSize}/{term}", 
    defaults: new { page = @"\d+", pageSize = @"\d+", term = UrlParameter.Optional } 
); 

Почему это не работает? Я получил ресурс, который не может быть найден при попытке называть его через почтальон, используя URL-адрес localhost/api/company/1/10/a, где 1 = страница, 10 = pageSize и a = термин

Возможно, простой ответ, но новый для MVC, который до сих пор учится.

+0

Использовать атрибут маршрута, если вы работаете с веб-API 2. http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api -2 –

ответ

1

1- Вы используете метод GET, который означает, что вы можете передать опцию поиска через URL-адрес, так что вы можете создать объект параметров поиска, например:

public class SearchOptions 
{ 
    public string Term{get; set;} 
    public int Page {get; set;} 
    public int PageSize {get; set;} 
} 

, то вы можете изменить свой метод, чтобы быть, как это

[HttpGet] 
[Route("api/blabla/SearchSomething")] 
public async Task<IHttpActionResult> Get([FromUri]SearchOptions searchOptions) { 
    ... 

    return Ok(results); 
} 

Обратите внимание на маршрут атрибут, который я украсил метод, вы можете использовать различные ограничения для параметров методов, посмотрите на this.

Наконец, вы можете вызвать метод от клиента как этот

api/blabla/SearchSomething?term=somevalue&page=1&pageSize=10 

Надежда, что помогает.

+0

Спасибо u. Вы проверите это. Например, как бы вы называть этот метод get? Я не уверен в части ofurl? – Gillardo

+0

[FromUri] сообщает привязке модели к построению SearchOptions из строки запроса не из тела запроса, поэтому вам нужно передать параметры поиска с помощью строки запроса. см. это http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api –

+0

Woeks отлично. Спасибо – Gillardo

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