带有routeValues的ActionLink创建了old-skool样式的URL

时间:2010-08-11 00:50:19

标签: asp.net-mvc-2

我的路线定义如下:

    routes.MapRoute(
        "CustomerWithScreenName", // Route name
        "Customer/{sn}/{action}", // e.g. Customer/KingKong89/Schedule
        new { controller = "Customer", action = "Signup", id = "" } // Parameter defaults
    );

但是当我使用ActionLink这样制定链接时:

<%: Html.ActionLink("Click here", "Schedule", "Customer", new { sn = "KingKong89", new { @class="topLink" } )%>

生成的超链接/ URL如下所示:

http://localhost:65071/Customer/Schedule?sn=KingKong89

它有效但我希望ActionLink使用已知的路由并构建正确的链接:

http://localhost:65071/Customer/KingKong89/Schedule

我的期望是错的吗?这是参数化的URL,它应该如何工作?

注意:我没有在路线中指定{controller}。我似乎无法将这条路线与更正统的{controller} {action} {id}路线混合在一起 - 也许我应该停止尝试变得聪明并采用惯例。

感谢您的帮助。路加。

更新

我有一个理论,如果没有正确的路由(包括{controller}特殊关键字),我将无法使ActionLink生成正确的URL。

所以我现在把目光转向为什么这条简单的路线不起作用:

routes.MapRoute(
        "ControllerWithScreenName", // Route name
        "{controller}/{sn}/{action}", // e.g. Customer/Dave/Schedule
        new { controller = "Customer", action = "Signup", sn = "" } // Parameter defaults
        );

作为唯一的路线,连同默认的“Root”,它不会打球。如果特别添加了控制器名称(如上面的第一个代码段所示),那就是。

更新2

由于时间限制,我放弃了我的param-before-action样式URL并返回到默认的controller \ action \ param - 这是一个很小的事情,在进步的宏伟计划中,并没有感到沮丧和凹陷。

更新3

我将取消注释所有smart-ass路由并尝试使用RouteLink并指定要使用的路由类型。我认为这是RouteLink评论的存在理由。

更新4

这不好。这要求应用程序了解要采取的路由,这意味着我将失去以后只更改路由的选项,并自动更新所有链接。

1 个答案:

答案 0 :(得分:1)

首先,您要使用未使用的参数定义路线,您应该像这样定义路线

routes.MapRoute(
    "CustomerWithScreenName", // Route name
    "Customer/{sn}/{action}", // e.g. Customer/KingKong89/Schedule
    new { controller = "Customer", action = "Signup", sn= "" } // Parameter defaults
);

定义中的sn未在参数中定义,而是定义id。在默认路由之前定义路由。

其次,你的ActionLink应该是这样的

<%= Html.ActionLink("Click here", "Schedule", "Customer", new { sn = "KingKong89" }, new { @class = "topLink" })%>

最后,在您的控制器中,您的操作方法计划的参数应为sn而不是id

public ActionResult Schedule(string sn)
{
    return View();
}