Использование Url.RouteUrl() с именами маршрутов в области - программирование
Подтвердить что ты не робот

Использование 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 }), это не проблема.

Почему мне нужно указывать действие и контроллер, если они уже имеют значения по умолчанию в сопоставлении маршрутов? Что мне не хватает?

4b9b3361

Ответ 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" })