2013-03-08 3 views
3

Привета Я пытаюсь определить путь маршрутизации для моего URL.This является то, что он выглядит так далеко:Определения маршрутизации для приложения

routes.MapRoute(
      name: "Category", 
      url: "{controller}/DisplayBooksByCategory/{categoryId}/{pageNumber}", 
      defaults: new { controller = "Home", action = "DisplayBooksByCategory" } 
     ); 

Это работает, но это не совсем то, что я want.At момента мой URL выглядит примерно так:

http://localhost:51208/Home/DisplayBooksByCategory/7/1

То, что я хочу, чтобы иметь возможность заменить CategoryId с фактической категории name.The категории п AME не передается в качестве параметра к действию только categoryId.This мое действие:

public ActionResult DisplayBooksByCategory(int pageNumber, int categoryId) 
    { 
     int bookByCategoryCount = bookRepository.CountBooksByCategory(categoryId); 
     var entities = new BooksAndCategories 
     { 
      Books = bookRepository.GetBookByCategory(categoryId, pageNumber, numberOfBooksOnPage), 
      PageNumber = pageNumber, 
      LastPageNumber = (bookByCategoryCount/numberOfBooksOnPage) + 1, 
      NumberOfBooksPerPage = numberOfBooksOnPage, 
      Categories = categoryRepository.GetCategories(), 
      CurentPage = "ProductManager", 
      CurentCategory = categoryId 
     }; 
     return View("DisplayBooksByCategory", entities); 
    } 

Есть ли способ сделать это с помощью API маршрутизации без необходимости внесения изменений в действие?

ответ

2

Где вы собираетесь получить идентификатор категории, если вы не передадите его в запросе? Это невозможно. Идентификатор категории должен оставаться частью URL-адреса, но вы можете включить в маршрут параметр дружественной категории. Но не ожидайте, что идентификатор автоматически появится откуда-то.

Как и StackOverflow, это касается вопросов. Посмотрите на адресную строку браузера. Вы должны увидеть что-то вроде этого:

https://stackoverflow.com/questions/15290490/defining-routing-for-application 

Обратите внимание на идентификатор вопроса и удобное название вопроса. Это название предназначено исключительно для демонстрации целей и полностью игнорируется. Если хотите, вы можете заменить его на произвольную строку. Важная часть - это то, что однозначно идентифицирует сущность (которая является идентификатором).

Конечно, если имена вашей категории уникальны, вы можете использовать имя категории вместо идентификатора в маршруте. Кроме того, если вы идете по этому пути, не забывайте, что есть некоторые специальные символы, которые не разрешены в части пути URL-адреса. Скотт Хансельман написал nice blog post на эту тему. Вам нужно будет отфильтровать эти опасные символы и заменить фактическое название категории так называемым slug. Вот, например, как StackOverflow делает это: https://stackoverflow.com/a/25486/29407

+0

Идентификатор категории останется в действии, что я не знаю, как я могу заставить URL-адрес выглядеть примерно так: http: // localhost: 51208/Главная/DisplayBooksByКатегория/Литература/1 – aleczandru

+0

Хорошо, оставайтесь в действии, но кто передаст его действию? Не забывайте, что связующее устройство по умолчанию передает параметры в действие из того, что присутствует в URL-адресе запроса. Поэтому, если идентификатор категории не является частью вашего маршрута, как я уже сказал в своем действии, не ожидайте, что он автоматически будет передан в действие вашего контроллера. Помните, что вся информация, которую вы передали в своем запросе, является «Литература», которая не является целым числом. –

+0

Понимание маршрутизации MVC хорошо, но если вы хотите что-то, что действительно может сэкономить ваше время, используйте библиотеку AttributeRouting из http://attributerouting.net/ (также на NuGet) – Prashant

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