【问题标题】:MVC5 Custom Route to Remove Controller Name from Area从区域中删除控制器名称的 MVC5 自定义路由
【发布时间】:2014-11-19 06:05:03
【问题描述】:

到目前为止,我无法完成这项工作,我需要一些帮助。我有一个基本的 MVC 5 站点,并且我添加了一个名为 Administration 的区域。对于我的生活,我无法弄清楚如何正确地为区域设置默认控制器/动作。

在我的站点中,我有一个名为 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,它显示我设置的视图(管理员/索引),并且 URL 保持为 http://myapplication/Admin(这是我想要的)。现在,通过添加它,它会中断到控制器的任何进一步路由。因此,当我尝试导航到管理区域中的菜单控制器时,它会失败。

有正确的方法吗?

即我需要使http://myapplication/Admin/Menu/Create 路由正确,但还需要保留该区域的默认Controller/Action。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-routing asp.net-mvc-areas


    【解决方案1】:

    您应该能够将它们组合成一个:

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

    通过分配默认值,您应该可以调用/Admin/,其余参数设置为默认值。

    【讨论】:

    • 非常感谢!我想我之前尝试过,但失败了,因为我在某处重用了一个类名,并认为它不起作用。您的答案是完美的,并且会这样设置。
    【解决方案2】:

    如果您对区域使用相同的控制器名称和默认名称(例如: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" }
                );
    

    【讨论】:

    • 感谢您的回复。这在今天仍然适用并且很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多