2013-03-21 116 views
2

我想达到改变我的应用程序的路线this目标看起来像这样的路线时恢复到查询字符串PARAMS:ActionLinks匹配不包含PARAM

hxxp://host/MyController/Widgets/3/AddWhatsit

这条路的观点将有助于为用户添加的whatsit到Widget的3

同样,我希望创建一个新的插件的路线是:

hxxp://host/MyController/Widgets/Create

我已经创建了单独的路线来尝试和促进这一点。它们是:

  routes.MapRoute("DefaultAction", 
          "{controller}/{action}", 
          new {controller = "Home", action = "Index"}); 

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

我遇到的问题是,当我浏览到该索引页的小工具(/ myController的/小工具,匹配“DEFAULTACTION”路线),这将带来一个新的URL参数设置的任何ActionLinks这不是该路线的一部分会变成查询字符串值。所以,举例来说,Widget 3的编辑链接将呈现为: Widget/Edit?id=3 instead of (what I would prefer): Widget/3 /编辑

我想我明白我不会把我的(可选)id参数放在末尾路线。

我应该把它吸起来,并在路线的尽头留下id?

回答

2

可以做到这一点。为了获得锚链接看起来像/主页/ 1 /指数,设定路线,如:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     name: "Custom", 
     url: "{controller}/{id}/{action}" 
     ); 

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

,然后在视图:

@Html.ActionLink("Here", "Index", "Home", new { id = 5 }, null) 

,你会得到呈现这样的链接:

<a href="/Home/5/Index">Here</a> 

怪癖是限制自定义路线。在这种情况下,我删除了默认值,他们没有意义。当然,路线的顺序。

+0

这让我非常接近。一个副作用是,如果我在使用像“/ Widget/4/Whatsits”这样的路径进行查看并且想将动作链接返回到“Widget/Index”,我会得到类似于“Widget/4/Index”没有必要。所以这会从“自定义”路线跳转到“默认”。 – 2013-03-21 20:53:39

+1

它看起来像我的第二个问题是单独的(环境路由值),所以我会关闭这一个。感谢您的回答。 – 2013-03-21 21:20:22

0

我相信你需要改变你的路线顺序。请记住,MVC会查看路由列表并选取匹配路由的第一个。具有ID参数的第二条路由更具体,因此应该先放在路由表中。

即使您已在ActionLink中指定了ID参数,也已指定了控制器和操作。因此,第一个路由由RoutingEngine选择。

最后,删除ID属性的可选参数。既然你希望在你有一个Id时选择这条路线,那么你不希望它成为一个可选参数,你希望它被要求匹配那条路线。

routes.MapRoute("Default","{controller}/{id}/{action}", 
    new {controller = "Home", action = "Index"}); 

routes.MapRoute("DefaultAction", "{controller}/{action}", 
    new {controller = "Home", action = "Index"});