2012-03-28 2 views
0

я эти два маршрута, сконфигурированной в моем приложении:ASP.NET MVC 3 URL.Action отображается на неправильном пути

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 «вместо« теста/брошюры ». Когда я в явном виде делаю

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

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

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

Обновления

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

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

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

Надежда это имеет смысл ....

ответ

0

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

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

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

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

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

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

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

Update Вы можете отобразить URL «/ testSpecifications» к действию со значениями по умолчанию так же, как вы делали выше:

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

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

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

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

+0

ERM .... Как это соответствует первому маршруту? Это требует, чтобы имя модели было «test». Я вообще не передавал имя модели в «Url.Action (« Брошюра »« test »)« – Jack

+0

Нет, вы устанавливаете значение по умолчанию of modelName для тестирования. –

+0

Итак, вы говорите, что если я конкретно не укажу имя модели, она будет соответствовать первому маршруту, так как имена действий и контроллеров совпадают, а параметр rest будет рассматриваться как значение по умолчанию, а не использовать его как требование соответствовать ему? – Jack