隐藏单个控制器的区域名称

时间:2016-04-25 16:17:44

标签: c# asp.net-mvc url-routing

我对MVC中的区域和网址路由很陌生,所以我不确定我需要做什么才能获得我想要的结果。

我有一个名为Policy的区域,在该区域内我有三个控制器:PolicyControllerGroupControllerSectionController

问题在于,例如,我想查看网址的详细信息:http://www.example.com/Policy/Policy/Detail/1,但我希望它看起来像:http://www.example.com/Policy/Detail/1

我已经看过一些关于如何完全隐藏网址的例子,但这不是我想做的事情。我仍然希望看到http://www.example.com/Policy/Group/Indexhttp://www.example.com/Policy/Section/Index

换句话说,当我使用与该区域同名的控制器时,我只想隐藏区域名称。

这可能吗?

2 个答案:

答案 0 :(得分:0)

您可以在通用区域注册码之前在区域注册类中添加特定路径定义。

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 
        );
    }
}

答案 1 :(得分:0)

您可以将默认控制器定义为您所在区域的入口点,但不能在路由时跳过控制器名称。否则,您必须为策略控制器中的每个操作创建一个默认路由:

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 }
    );
}

此设计的缺点是您无法在策略控制器上拥有与操作名称相同的控制器。

我建议您重新考虑区域命名,以便该区域的名称与控制器的名称不匹配。