3

我知道以前有人问过这个问题,但我真的在为 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?

在此先感谢您,并为提出之前已涵盖的问题而道歉-正如我所说,我真的在为路线图的整个概念而苦苦挣扎。

4

2 回答 2

2

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

您可以使用Html.ActionLink 方法的这种重载

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
于 2012-11-29T02:29:25.200 回答
0

编辑,尝试对索引执行空白操作:

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

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

您可以在(或者如果您使用的是 mvc3)中的默认路由上方添加一个Archive路由(例如):RouteConfigGlobal.asax

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

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

希望这能让它更清楚。

于 2012-11-29T02:34:04.280 回答