2011-01-18 5 views
1

Я поместил эту маршрутизацию в мой глобальный asax.Проблемы с маршрутизацией asp.net mvc

routes.MapRoute(
    "News", // Route name 
    "News/{timePeriod}/{categoryName}/{page}", // URL with parameters 
    new { controller = "News", action = "Index", 
     timePeriod = TimePeriod.AllTime, categoryName = "All", page = 1 }, 
    new { page = @"^\d{1,3}$" }// Parameter defaults 
); 

routes.MapRoute(
    "News2", // Route name 
    "News/{categoryName}/{page}", // URL with parameters 
    new { controller = "News", action = "Index", 
     timePeriod = TimePeriod.AllTime, categoryName = "All", page = 1 }, 
    new { page = @"^\d{1,3}$" }// Parameter defaults 
); 

Проблема заключается в том, как URLs/Новости/добавить не будет работать (если я не добавить конкретный маршрут) есть лучший способ без необходимости указывать URL действия в глобальном asax?

+2

BTW, строка, которую вы указали как параметр по умолчанию, представляет собой параметр Constraints. Параметры по умолчанию - одна строка выше. – mlusiak

ответ

0

Думаю, это поймает. Но только, если вы не будете передавать какие-либо дополнительные аргументы, такие как id (потому что, это очень похоже на маршрут News2).

routes.MapRoute(
"News0", 
"News/{action}", 
new { controller = "News", action = "Index" } 
); 

Кроме того, попробуйте Routing Debugger для проверки эффекта, который вы хотите: link

0

Ваши два маршрута выше, каждый маршрут к контроллеру новостей и нажмите «Index» действие. Если у вас нет перегрузок для действия индекса, в котором будут указаны параметры, которые вы указываете, маршрут будет работать неправильно. Например, вы должны иметь эти два действия:

public ActionResult Index(TimePeriod timePeriod, string categoryName, int page) {..} 

public ActionResult Index(string categoryName, int page) {..} 

Кроме того, вы должны удалить параметр по умолчанию TimePeriod от вашего второго маршрута, так как вы не используете его в самом маршруте:

routes.MapRoute(
       "News2", // Route name 
       "News/{categoryName}/{page}", // URL with parameters 
       new { controller = "News", action = "Index", categoryName = "All", page = 1 }, 
       new { page = @"^\d{1,3}$" }// Parameter defaults 
      ); 

Я бы рекомендовал иметь действие для каждой категории вместо создания маршрута для каждой категории. Вы могли бы упростить ваши маршруты к этому:

routes.MapRoute(
       "News", // Route name 
       "News/{action}/{timePeriod}/{page}", // URL with parameters 
       new { controller = "News", action = "Index", timePeriod = TimePeriod.AllTime, categoryName = "All", page = 1 }, 
       new { page = @"^\d{1,3}$" }// Parameter defaults 
      ); 

Тогда имеющие действия для каждой категории:

public ActionResult All(TimePeriod timePeriod, string categoryName, int page) {..} 

public ActionResult Sports(TimePeriod timePeriod, string categoryName, int page) {..} 

public ActionResult Weather(TimePeriod timePeriod, string categoryName, int page) {..} 

Таким образом, все, что вам нужно будет это один маршрут.

+0

Это приятное решение, но, возможно, reklas действительно хочет иметь разные маршруты, чтобы сделать его URL более приятным. Например, ему не нужна страница для добавления новостей, но она нужна, когда он отображает результаты. – mlusiak

+0

@kMike - Если это так, он просто должен сделать эти параметры необязательными на маршруте, и его URL не должен будет их содержать. – amurra