Использование Url.RouteUrl() с именами маршрутов в области
В качестве примечания, я понимаю всю проблему неоднозначных имен контроллеров и использовал пространство имен, чтобы мои маршруты работали, поэтому я не думаю, что это проблема Вот.
До сих пор у меня есть мои контроллеры уровня проекта, а затем Пользовательская область со следующей регистрацией:
public class UserAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "User";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"UserHome",
"User/{id}",
new { action = "Index", controller = "Home", id = 0 },
new { controller = @"Home", id = @"\d+" }
);
context.MapRoute(
"UserDefault",
"User/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
Здесь есть маршрут "UserHome", поэтому я могу разрешить маршрут /User/5
vs. /User/Home/Index/5
, который выглядит более понятным IMO.
В идеале я хотел бы использовать Url.RouteUrl("UserHome", new { id = 5 })
для генерации маршрута в другом месте, но это всегда либо возвращается пустым, либо дает мне исключение, поскольку он не может найти имя маршрута, которое, очевидно, существует.
Однако, когда я использую Url.RouteUrl("UserHome", new { controller = "Home", action = "Index", id = 5 })
, это не проблема.
Почему мне нужно указывать действие и контроллер, если они уже имеют значения по умолчанию в сопоставлении маршрутов? Что мне не хватает?
Ответы
Ответ 1
Я могу подтвердить, что с .NET 4.5.1 и MVC 5.2.2, как минимум, это поведение было исправлено и теперь работает так же, как с этим же точным кодом, используя Url.RouteUrl("UserHome", new { id = 5 })
.
Похоже, что это была ошибка, исправленная с момента моего сообщения.
Добавление этого в качестве ответа, поскольку, хотя решение TSmith будет работать, вам больше не нужно делать эту дополнительную работу, если есть исправление.
Ответ 2
Все, пожалуйста, смотрите ответ @ryanulit ниже. Эта проблема может быть исправлена для вас с более новой версией фреймворка.
Не уверен, что было исправление, но теперь поведение немного иное. Используя ваш точный код и пытаясь:
Url.RouteUrl("UserHome", new { id = 5 })
Теперь я получаю:
/User/5?httproute=True
Это все еще выглядит неловко, поэтому я поэкспериментировал с маршрутом и добавил еще один параметр по умолчанию:
context.MapRoute(
"UserHome",
"User/{id}",
new { action = "Index", controller = "Home", area = "User", id = 0,
httproute = true },
new { controller = @"Home", id = @"\d+" }
);
Теперь, когда я использую
Url.RouteUrl("UserHome", new { id = 5 })
Я получаю хороший URL
/User/5
httproute=true
от ответственности В объявлении маршрута могут быть нежелательные побочные эффекты httproute=true
.
Также более многословное использование:
@Url.RouteUrl("UserHome", new { controller = "Home", action = "Index", id = 5 })
все еще работает так же.
Ответ 3
Попробуйте следующее:
@Url.Action("Index", "Home", new { Area = "User" })