Nigrimmist
@Nigrimmist
Asp.net senior developer

С чем связано странное поведение Url.Action в asp.net mvc 4?

Специально для чистоты эксперимента создал новое asp.net mvc 4 приложение.
Роуты :
//more detail route
routes.MapRoute(
            name: "{lang}/category/{category}",
            url: "{lang}/category/{category}",                
            defaults: new { controller = "Home", action = "Index" }
        );
        //more general route
        routes.MapRoute(
            name: "{lang}",
            url: "{lang}",

            defaults: new { controller = "Home", action = "Index"  }
        );


HomeController :

[HttpGet]
public ActionResult Index(string category)
{
   return View("~/Views/Home/index.cshtml");
}


На view :

Url.Action("Index","Home", new {lang="en"});

А теперь вопрос - почему на любой странице Url.Action генерирует в html "/en" (как и задумано), но вот на странице "/en/category/1" - этот же Url.Action генерирует уже "/en/category/1"?

Выглядит так, как будто category route value просачивается из урла на генерацию Url.Action.

Неужели данные роутов с URL как-то аффектают генерацию самих роутов? Может, кто сталкивался или сможет навести на полезную ссылку с объяснением подобного поведения - буду благодарен.

ps. Решил через Action.RouteUrl и указанием нужного роута по имени, но вопрос это не снимает.

Update : stackoverflow.com/questions/20349681/urlhelper-act...

всё таки это by design, при формировании урла - в учёт берутся и текущие route data из Request.
  • Вопрос задан
  • 2902 просмотра
Пригласить эксперта
Ответы на вопрос 1
поменяйте роуты местами:
//more general route
        routes.MapRoute(
            name: "{lang}",
            url: "{lang}",

            defaults: new { controller = "Home", action = "Index"  }
        );
        routes.MapRoute(
            name: "{lang}/category/{category}",
            url: "{lang}/category/{category}",                
            defaults: new { controller = "Home", action = "Index" }
        );
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы