从具有MVC路由的URL中删除控制器和操作

时间:2012-11-29 02:16:02

标签: asp.net-mvc

我知道之前已经问过这个问题,但我真的很挣扎于MVC中的路由配置概念 - 特别是从URL中删除控制器名称和/或动作名称。

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

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

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

构建链接时,URL显示为

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

我的问题是在网址中出现“补充工具栏”部分 - 此控制器在技术上不是使用进行任何导航;它只是用来构建局部视图。相反,我希望URL读取:

http://localhost/Archive/December-2012

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

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

有人可以解释(用简单的术语)我如何配置路由,以便当/ Archive放在URL的末尾时,它知道用(假设)索引(id)动作调用ArchiveController吗? / p>

提前感谢,并且对于提出之前已经涉及过的问题道歉 - 正如我所说的那样,我只是在努力解决路线图的整个概念。

2 个答案:

答案 0 :(得分:2)

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

您可以使用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 } 
);

相同的操作链接应映射到此网址:

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

请记住路线必须高于默认路线。

此网址应该有效:

http://localhost/Archive/December-2012

答案 1 :(得分:0)

修改,为索引尝试空白操作:

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

有人可以解释(用简单的话说)我如何配置   路由,以便当/ Archive放在URL的末尾时,它知道   用(假设)索引(id)动作调用ArchiveController?

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

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

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

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

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

每次您的网址开始时都会点击http://localhost/archive

希望更清楚。