Пользовательский маршрут MVC5 для удаления имени контроллера из области

Пока я не могу сделать эту работу, и мне нужна помощь, пожалуйста. У меня есть базовый сайт MVC 5, и я добавил область под названием «Администрирование». На всю жизнь я не могу понять, как правильно установить контроллер/действие по умолчанию для области.

На моем сайте у меня есть область с именем Admin, контроллер с именем Admin (с методом Index и представлением), и это регистрация области:

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        name: "Admin_base",
        url: "Admin",
        defaults: new { area = "Admin", controller = "Admin", action = "Index", id = UrlParameter.Optional }
    );

    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
    );
}

Первый MapRoute позволяет мне перейти к http://myapplication/Admin и отображает заданное мной представление (Admin/Index), а URL-адрес остается http://myapplication/Admin (это то, что я хочу). Теперь, добавив это, он прерывает любую дальнейшую маршрутизацию к контроллеру. Поэтому, когда я пытаюсь перейти к контроллеру меню в области администратора, это не удается.

Есть ли правильный способ сделать это?

т. е. мне нужно правильно создать маршрут http://myapplication/Admin/Menu/Create, но также нужно сохранить контроллер/действие по умолчанию для области.


person clockwiseq    schedule 24.09.2014    source источник


Ответы (2)


Вы должны просто объединить их в один:

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    defaults: new { area = "Admin", 
                    controller = "Admin", 
                    action = "Index", 
                    id = UrlParameter.Optional }
);

Назначив значения по умолчанию, вы должны иметь возможность вызывать /Admin/, а для остальных параметров устанавливаются значения по умолчанию.

person Erik Philips    schedule 24.09.2014
comment
Большое спасибо! Я думаю, что пробовал это раньше, и это не удалось, потому что я где-то повторно использовал имя класса и думал, что это не сработает. Ваш ответ идеален и установит его как таковой. - person clockwiseq; 24.09.2014

Если вы используете одно и то же имя контроллера для области и по умолчанию (например, HomeController). Используйте пространства имен для этого

context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new {
                    area = "Admin",
                    controller = "Home",
                    action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "{{Namespace}}.Areas.Admin.Controllers" }
            ); 

по умолчанию один

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new {  controller = "Home", 
                action = "Index", 
                id = UrlParameter.Optional },
                namespaces: new[] { "{{Namespace}}.Controllers" }
            );
person Abdul Rahim    schedule 22.03.2018
comment
Спасибо за ответ. Это все еще применимо сегодня и полезно. - person clockwiseq; 22.03.2018