我的路线定义如下:
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
这不好。这要求应用程序了解要采取的路由,这意味着我将失去以后只更改路由的选项,并自动更新所有链接。
答案 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();
}