2017-01-19 2 views
5

Я использую Attribute Routing в приложении MVC4. Я установил маршрут до [Route("test-{testParam1}-{testParam2}")]. Здесь `{testParam2} 'может состоять из слова« тест ». Например, если я ввожу URL-адрес, как указано ниже,Маршрутизация атрибутов не работает в MVC4

localhost:33333/test-temp-test-tempparam2 

Это дает мне 404 ошибки. Здесь, в URL-адресе, здесь {testParam2} имеет два слова test tempparam2, отформатированный до test-tempparam2. Когда test слово находится в последнем положении {testParam2}, он работает хорошо. Это означает, что если URL-адрес похож на .../test-temp-tempParam2-test работает хорошо. Но после этого дайте ошибку. .../test-temp-test-tempParam2.

Ниже приведен код, который может помочь ...

[Route ("test-{testParam1}-{testParam2}")] 
public ActionResult Foo (int testParam2) {...} 

Теперь попробуйте следующие два URL.

  1. localhost:(port)/test-temp-1

  2. localhost:(port)/test-test-temp-1

В моем случае второй дает ошибку. В этом случае первый параметр отформатирован до test-temp от test temp. Сначала работает хорошо.

Как решить эту проблему?

+0

Вы можете использовать {testparam2}, как test_tempparam2 –

+0

Взгляните на этот проект на GitHub. Он распространяется как пакет nuget. https://github.com/AtaS/lowercase-dashed-route – jvanrhyn

+0

@DhavalR предоставляет [mcve], который может использоваться для воспроизведения проблемы. Таким образом, он может быть использован для поиска лучших ответов. – Nkosi

ответ

2

OP указал, что последний параметр в шаблоне маршрута является int

Используйте маршрутное ограничение.

Ограничения маршрута позволяют ограничить соответствие параметров в шаблоне маршрута. Общий синтаксис: {parameter:constraint}. Например:

[Route ("test-{testParam1}-{testParam2:int}")] 
public ActionResult Foo (int testParam2) {...} 

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

localhost:(port)/test-temp-1 

localhost:(port)/test-test-temp-1 

Первое будет соответствовать данным маршрута {testParam1 = temp}-{testParam2 = 1}

А второму будет соответствовать данным маршрута {testParam1 = test-temp}-{testParam2 = 1}

+0

Ну, я узнал о 'constraint' в' Attribute Routing'. Ваш пример и объяснение хороши. Но я пойду с комментарием Фрэнк Фэйхардо. Потому что ваш код (url) работает так, как вы упомянули. Но когда дело доходит, когда '{tempParam1}' имеет более двух символов (например, temp-test-temp), он будет вызывать ошибку. Если у вас есть URL-адрес, например 'test-temp-test-2', он будет работать. Но когда это «test-temp-test-temp-2», работать не будет. Так что пришлось изменить мой «Маршрут атрибутов», например '~/{tempParam1} - {tempParam2}' или 'test/{tempParam1} - {tempParam2}'. BTW Спасибо за ваш ответ и объяснение. – DhavalR

0

У вас есть следующий фрагмент кода в вас global.asax файл?

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”); 

    routes.MapMvcAttributeRoutes(); 

    routes.MapRoute(
     name: “Default”, 
     url: “{controller}/{action}/{id}”, 
     defaults: new { controller = “Home”, action = “Index”, id = UrlParameter.Optional } 
    ); 
}