2010-02-23 2 views
1

Просить лучший способ для решения этой проблемы:URL имя параметра маршрутизации, порядок

в моем контроллере я следующее действие

public ActionResult Member(string id){return View();} 

другое действие в том же контроллере

public ActionResult Archive(string year){return View();} 

in my global.asax

routes.MapRoute(
      "Archive",            // Route name 
      "{controller}/{action}/{year}",       // URL with parameters 
      new { controller = "Home", action = "Index", year = "" } // Parameter defaults 
     ); 

routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id="" } // Parameter defaults 
     ); 

, если я назову этот url mysite.com/archive/2009, это работает, потому что действие, ожидающее параметр с именем «год» и первая схема маршрута, работает с этим запросом. Но если я назову этот url mysite.com/member/john, это приведет к этому url mysite.com/member?id=john Так выглядит, если мой первый маршрут в global.asax имеет ту же конструкцию, но другое имя параметра, имя с правильным именем параметра будет иметь правильный url (mysite.com/archive/2009), а для другого - нет. Как я могу решить эту проблему? Я могу изменить таблицу маршрутов, чтобы ожидать общее имя параметра, например «param», но мне нужно также изменить всю подпись действия на «param», и это не очень описательно (param вместо year или param вместо id).

ответ

0

Попробуйте это:

routes.MapRoute(
      "Archive",            // Route name 
      "Home/Member/{id}",       // URL with parameters 
      new { controller = "Home", action = "Member", id = "" } // 
Parameter defaults 
     ); 

routes.MapRoute(
      "Archive",            // Route name 
      "{controller}/{action}/{year}",       // URL with parameters 
      new { controller = "Home", action = "Index", year = "" } // Parameter defaults 
     ); 

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

Вот link для более подробной информации о фоновой ситуации. Некоторые из синтаксиса изменились с момента написания статьи, но основные правила выглядят актуальными.

+0

снова сбивает с толку, я бы использовал ID для члена не года. – dritterweg

+0

Извините, что сделал редактирование. Главное, что вам нужно указать это действие на маршруте, чтобы класс маршрутизации мог определить, какой маршрут использовать. Кроме того, он использует первый маршрут, который соответствует, поэтому вам нужно сначала указать более конкретный маршрут. –

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