Проблема сопоставления маршрутов ASP.NET MVC - PullRequest
1 голос
/ 09 сентября 2010

Я борюсь с генерацией исходящих URL-адресов в asp.net mvc 2. Вот сценарий.

Контроллер: MoveController Действие: Индекс () Вид: Index.aspx

Теперь я хотел бы, чтобы несколько URL отображались на один контроллер (MoveController) и action (Index) с другим параметром ( locationId ), значение

, например

  • url -> RouteData
  • / Производство / -> Переместить / Индекс / 1
  • / Установка / -> Переместить / Указатель / 2
  • / Переместить / 3 / -> Переместить / Указатель / 3

Мое отображение выглядит так:

 public static void RegisterRoutesTo(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("{*favicon}", new
        {
            favicon = @"(.*/)?favicon.ico(/.*)?"
        });

        routes.MapRoute(
           null,                                              // Route name
           "Production/{locationId}",                           // URL with parameters
           new
           {
               controller = "Move",
               action = "Index"
           },  // Parameter defaults
           new
           {
               locationId = @"\d+"
           }// constraint for Production url
       );

        routes.MapRoute(
           null,                                              // Route name
           "Installation/{locationId}",                           // URL with parameters
           new
           {
               controller = "Move",
               action = "Index"
           },  // Parameter defaults
           new
           {
               locationId = @"\d+"
           }// constraint for Production url
       );

        routes.MapRoute(
           null,                                              // Route name
           "Move/{locationId}",                           // URL with parameters
           new
           {
               controller = "Move",
               action = "Index"
           },  // Parameter defaults
           new
           {
               locationId = @"\d+"
           }// constraint for Production url
       );

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

Теперь, чтобы сгенерировать исходящие URL в меню главной страницы, я делаю что-то подобное

<%= Html.ActionLink("Production", "Index", "Move", new{locationId = 1}, null)%>
<%= Html.ActionLink("Installation", "Index", "Move", new{locationId = 2}, null)%>

Но вышеизложенное порождает

  • / Производство / 1
  • / Производство / 2

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

  • / Производство / когда locationId = 1
  • / Установка / когда locationId = 2

Есть идеи?

Пользователи

Ответы [ 3 ]

2 голосов
/ 09 сентября 2010

длинный выстрел, но определенно стоит попробовать, так как ваши маршруты выше не выражают то, что вы хотите:

routes.MapRoute(
   null,                                              // Route name
   "Production/",                           // URL with parameters
   new
   {
       controller = "Move",
       action = "Index",
       locationId = 1
   }

);

routes.MapRoute(
   null,                                              // Route name
   "Installation/",                           // URL with parameters
   new
   {
       controller = "Move",
       action = "Index",
       locationId = 2
   }

);

1 голос
/ 10 сентября 2010

Вы правы. Маршруты производства и установки точно такие же. Я просто не знал, как их дифференцировать, поскольку они оба принимают один и тот же параметр {locationId}, но с разными значениями. Как видите, я предоставил значение по умолчанию, которое будет другим, но это просто значение по умолчанию, поэтому я попытался наложить на них ограничение

routes.MapRoute(
               null,                                              // Route name
               "Production/{locationId}",                           // URL with parameters
               new
               {
                   controller = "Move",
                   action = "Index",
                   locationId = 1
               }
               ,  // Parameter defaults
               new
               {
                   locationId = @"1"
               }// constraint for Production url
           );

            routes.MapRoute(
               null,                                              // Route name
               "Installation/{locationId}",                           // URL with parameters
               new
               {
                   controller = "Move",
                   action = "Index",
                   locationId = 2
               }
               ,  // Parameter defaults
               new
               {
                   locationId = @"2"
               }// constraint for Production url
           );

Это работает, но потом я понимаю, что при определении Html.ActionLink для параметров задается значение null

<%= Html.ActionLink("Installation", "Index", "Move", null, null)%>

он производит Production / url, который должен быть первым в заказе.

Что я не знал, так это то, что не обязательно определять {параметры} в URL. Я всегда думал, что параметры должны быть определены в URL.

Спасибо за помощь, ребята

0 голосов
/ 09 сентября 2010

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

...