ASP.NET MVC 3 URL.Действие сопоставлено с неправильным маршрутом - PullRequest
0 голосов
/ 28 марта 2012

В моем приложении настроены эти два маршрута:

routes.MapRoute(
             "PromotionModel-test", // Route name
             "testSpecifications", // URL with parameters
             new { controller = "test", action = "Brochure", modelName = "test", groupID = 0 } // Parameter defaults
         );

routes.MapRoute(
          "", // Route name
          "{controller}/{action}/{id}", // URL with parameters
          new { groupID = 0, controller = "Home", action = "List", id = UrlParameter.Optional, CatID = 0 },
          new {controller = @"\w{3,}"}
        );

Когда я вызываю

 @Url.Action("Brochure", "test")

, сгенерированный URL-адрес будет "/ testSpecifications" вместо "test / Brochure",Когда я явно делаю

@Url.Action("Brochure", "test", new { modelName = string.Empty })

, тогда это даст правильный результат.

Я знаю, что есть сценарий повторного использования переменных сегмента, но как он здесь применяется?Какая логика скрыта за сценой?

Обновления

Чего я хочу достичь, это просто создать URL-адрес, который я имел выше, без необходимости явно устанавливать значения параметров.

Представьте, что вы начали разработку веб-сайта, на котором не требовалось никаких параметров.Позже вы заметили, что вам может понадобиться добавить несколько дополнительных параметров, в приведенном выше примере добавлен новый параметр - «modelName».И затем ваш клиент запрашивает сопоставление «testSpecifications» для сопоставления с конкретной страницей, подобной приведенной выше.

Мы определенно не хотим возвращаться, чтобы обновить все действия Url.Action, чтобы установить значения по умолчанию длякаждый из них.Какой подход вы бы использовали, чтобы справиться с этим?

Надеюсь, что это имеет смысл ....

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Логика действительно проста на самом деле. Маршруты имеют приоритет в порядке объявления. А поскольку "Url.Action("Brochure" "test") соответствует первому маршруту, то вполне естественно, что именно MVC использует.

Во втором случае вы явно установите modelName, что означает, что он больше не соответствует первому маршруту. Это оставляет маршрут по умолчанию.

Обновление Вы можете отобразить url '/ testSpecifications' на действие со значениями по умолчанию, как вы это делали выше:

routes.MapRoute(
      "PromotionModel-test", // Route name
      "testSpecifications", // URL with parameters
      new { controller = "test", action = "Brochure", modelName = "test", groupID = 0}); 

Однако, если вы в какой-то момент захотите сгенерировать этот URL с другим значением для modelName, вам придется привязать этот параметр к URL:

routes.MapRoute(
     "PromotionModel-test", // Route name
     "testSpecifications/{modelName}", // URL with parameters
      new { controller = "test", action = "Brochure", modelName = "test", groupID = 0}); 
    );

С указанным выше маршрутом вы можете либо просто связать '/ testSpecifications', в этом случае будут использоваться значения по умолчанию для modelName, либо вы можете просто установить значение для modelName: '/testSpecifications/SomeModelName'.

0 голосов
/ 29 марта 2012

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

routes.MapRoute(
             "PromotionModel-test", // Route name
             "testSpecifications", // URL with parameters
             new { controller = "test", action = "Brochure", modelName = "test", groupID = 0 } // Parameter defaults
         );

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

Я сам был удивлен, когда увидел, что он правильно отображает как входящий запрос (localhost / testSpecifications), так и генерацию URL (Url.Action ("Brochure, Test") ... ...

 routes.MapRoute(
                 "PromotionModel-test", // Route name
                 "testSpecifications", // URL with parameters
                 new { controller = "test", action = "Brochure", modelName = "test", groupID = 0 },
               new { modelName="test"}
             );
...