Я новичок в области и маршрутизации URL-адресов в MVC, поэтому я не уверен, что мне нужно сделать здесь, чтобы получить результат, который я ищу.

У меня есть область под названием Policy, внутри которой у меня есть три контроллера: PolicyController, GroupController и SectionController.

Проблема с этим возникает, когда я хочу, например, перейти к деталям политики, URL-адрес выглядит так: http://www.example.com/Policy/Policy/Detail/1, но вместо этого я хотел бы, чтобы он выглядел так: http://www.example.com/Policy/Detail/1

Я видел несколько примеров того, как полностью скрыть область из URL-адреса, но я бы не хотел этого делать. Как я бы хотел видеть http://www.example.com/Policy/Group/Index или http://www.example.com/Policy/Section/Index

Другими словами, я хотел бы скрыть только имя области, когда я использую контроллер, имя которого совпадает с именем области.

Возможно ли это сделать?

0
Quiver 25 Апр 2016 в 19:17

2 ответа

Лучший ответ

Вы можете определить контроллер по умолчанию в качестве точки входа в вашем регионе, но вы не можете пропустить имя контроллера при маршрутизации. В противном случае вам пришлось бы создать маршрут по умолчанию для каждого действия в контроллере политики:

public override void RegisterArea(AreaRegistrationContext context) 
{
    // Entry point for each action on Policy controller
    context.MapRoute(
        "Policy_default_detail",
        "Policy/Detail/{id}",
        new { controller = "Policy", action = "Detail", id = UrlParameter.Optional }
    );

    context.MapRoute(
        "Policy_default_anotheraction",
        "Policy/AnotherAction/{id}",
        new { controller = "Policy", action = "AnotherAction", id = UrlParameter.Optional }
    );


    // Default entry point
    context.MapRoute(
        "Policy_default",
        "Policy/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
    );
}

Обратной стороной этой конструкции является то, что у вас не может быть контроллера с тем же именем, что и у действия на контроллере политики.

Я предлагаю вам переосмыслить именование областей, чтобы название области не совпадало с названиями контроллеров.

0
Balde 25 Апр 2016 в 17:13

Вы можете добавить конкретное определение маршрута в свой класс регистрации области перед общим кодом регистрации области.

public class PolicyAreaRegistration : AreaRegistration
{
    public override void RegisterArea(AreaRegistrationContext context)
    {

        context.MapRoute(
            "Policy_Tricky",
            "Policy/{action}/{id}",
            new { action = "Index", controller = "Policy", id = UrlParameter.Optional },
           new string[] { "YourProjectName.Areas.Policy.Controllers" }
        );


        context.MapRoute(
            "Policy_default",
            "Policy/{controller}/{action}/{id}",
            new { action = "Index", controller = "Home", id = UrlParameter.Optional },
           new string[] { "YourProjectName.Areas.Policy.Controllers" }
           //Providing namespace while defining route to prevent conflict 
        );
    }
}
0
Shyju 25 Апр 2016 в 17:04