【问题标题】:remove controllers and actions from URL with MVC routes使用 MVC 路由从 URL 中删除控制器和操作
【发布时间】:2012-11-17 01:18:47
【问题描述】:

我知道以前有人问过这个问题,但我真的在为 MVC 中的路由配置概念而苦恼 - 特别是从 URL 中删除控制器名称和/或操作名称。

在我的网页上,我有一个名为“Sidebar”的局部视图,它使用自己的控制器 (SidebarController)。

在侧边栏的局部视图中,我有以下 ActionLink:

@Html.ActionLink("December-2012", "Archive", new { id = "December-2012" })

链接建立后,URL 为

http://localhost/Sidebar/Archive/December-2012

我的问题是“侧边栏”部分出现在 URL 中 - 从技术上讲,此控制器不用于任何导航;它仅用于构建局部视图。相反,我希望 URL 读取:

http://localhost/Archive/December-2012

我尝试在 ActionLink 上指定控制器,但这只会导致

http://localhost/Archive/Archive/December-2012

有人可以解释一下(用简单的术语)我如何配置路由,以便当 /Archive 放在 URL 的末尾时,它知道使用(比如说)Index(id) 操作调用 ArchiveController?

在此先感谢,并为提出之前讨论过的问题表示歉意 - 正如我所说,我真的在为路线图的整个概念而苦苦挣扎。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    不完全确定您在这里做错了什么。也许还包括第二个 url 的代码。

    您可以使用 Html.ActionLink 方法的this overload

    public static MvcHtmlString ActionLink(
        this HtmlHelper htmlHelper,
        string linkText,
        string actionName,
        string controllerName,
        Object routeValues,
        Object htmlAttributes
    )
    

    你会这样使用它:

    @Html.ActionLink("December-2012(ThisIsLinkText)", "Index", "Archive", 
                     new { id = "December-2012"}, null);
    

    这将产生以下网址:

    http://localhost/Archive/Index/December-2012
    

    更新:

    根据您的评论,您需要这条路线高于默认路线:

    routes.MapRoute(
        "ArchiveRoute", 
        "Archive/{id}", 
        new { controller = "Archive", action = "Index", id = UrlParameter.Optional } 
    );
    

    同样的动作链接应该映射到这个url:

    @Html.ActionLink("December-2012(ThisIsLinkText)", "Index", "Archive", 
                     new { id = "December-2012"}, null);
    

    记住路由必须高于默认路由。

    这个网址应该可以工作:

    http://localhost/Archive/December-2012
    

    【讨论】:

    • 这非常接近 - 我尝试过重载,但它会产生一个新问题,即 URL 中出现“索引”操作。理想情况下,我希望只使用 /Archive/{id} 而不是 /Archive/{action}/{id},然后让路由图“知道”它必须调用 Index(id) 操作而无需它在 URL 中指定。
    • @user1861826 啊,我明白了。你的问题不是很清楚。
    • 哈哈!发现!谢谢!!我希望我可以投票给你的答案,但由于我刚刚在网站上注册,我没有 15 名代表对答案进行投票。但这正是我所需要的(老实说,现在我看到它起作用了,我想知道为什么我花了这么长时间才“得到它”!)
    【解决方案2】:

    编辑,为索引尝试空白操作:

    @Html.ActionLink("December-2012", "", "Archive", new { id = "December-2012" }, null)
    

    有人可以解释一下(用简单的术语)我是如何配置一个 路由,以便当 /Archive 放在 URL 的末尾时,它知道 使用(比如说)Index(id) 操作调用 ArchiveController?

    默认路由应该是这样做的。这是默认路由:

    routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
    

    这里发生的情况是,当您在http://localhost/ 中输入您的网址时,它会运行该路由,并注意到没有指定控制器/操作,因此它会转到默认的“主页”,并运行默认操作这是“索引”。

    您可以在RouteConfig(或Global.asax,如果您使用mvc3)中的默认路由上方添加Archive 路由(例如):

    routes.MapRoute(
                    name: "ArchiveRoute",
                    url: "archive/{id}",
                    defaults: new { controller = "Archive", action = "Index", id = UrlParameter.Optional }
                );
    

    每次您的网址以http://localhost/archive 开头时都会触发

    希望它更清楚。

    【讨论】:

    • 您提到的第一个重载不存在。没有Html.ActionLink(this,string,string,string,object)。见msdn
    • @rudeovski ze bear 感谢您对路线的解释 - 有助于解决问题。对于我在这个网站上的第一篇文章,我被你们的回复速度所震撼!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多