2010-08-11 45 views
0

我有一个路线定义为这样:ActionLink的与routeValues创建旧斯库尔风格的URL

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

产生的超级链接/ URL:

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

但是,当我使用的ActionLink这样制定的链接出来是这样的:

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

它的工作原理,但我EXPE反恐执行局的ActionLink使用已知的路线和建设的正确链接具体做法是:

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

是我的期望错了吗?它是如何工作的参数化URL?

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

感谢您的帮助。卢克。

UPDATE

我有一个理论,如果没有合适的途径(包括{}控制器特殊的关键字),我将无法使ActionLink的产生正确的URL。

所以我现在把我的目光投向了为什么这个简单的路线不工作:

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

作为唯一的途径,用默认的“根”一起,它不会起球。如果控制器名称是专门添加的(如上面的第一个代码段所示)。在盛大的一个小东西 -

更新2

由于时间有限,我对我的PARAM前方的动作风格URL放弃,并回到默认的控制器\行动\参数进步的方案,而不是感到沮丧和郁闷。

更新3

我会以取消我所有的智能屁股路线和尝试使用RouteLink并指定路线使用的类型。我认为这是RouteLink评论的存在理由。

UPDATE 4

这也是白搭。这要求应用程序了解要采取的路线,这意味着我将失去将来仅改变路线的选项,并让所有链路自动更新。

回答

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" })%> 

最后,在你的控制,你的动作方法Schedule参数应该是sn没有id

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

喜罗布,并感谢您帮帮我。我纠正了路径(id> sn),第二个是这里的错字,第三个已经是如何设置的。它仍然在生成旧的网址。我要进一步调查。 – 2010-08-11 11:35:41

+0

你确定吗?在我发布之前,我已经测试过这个版本,并且它在我的最后工作正常。 – 2010-08-11 11:45:32

+0

我只是再次测试,以确保我得到:

  • LukeSkywalker
  • 在源。我放弃并使用标准。点点吧 - 没有时间。如果我写MVC 2,我会通过属性和模糊匹配逻辑来设置自己的路由集。再次为您的帮助欢​​呼。赞赏。 – 2010-08-11 12:12:58