2009-02-23 58 views
4

我是新来的MVC土地,并有一个应用程序,我正在努力。我有2路在我的世界。当我要求它创建它作为第一个路径的ActionLink的这是相当similiarMVC ActionLink生成不同类型的链接...为什么?

路线1

routes.MapRoute("Category", "Movies/{category}/{subcategory}", 
    new { controller = "Catalog", action = "Index", category = "", subcategory = "" }); 

路线2

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

2个不同的链接我认为它应该:

.../Movies/Category/SubCategory

然而,当我创建我的第二个链接它填充它是这样的:

.../Movie?movieId=ff569575-08ec-4049-93e2-901e7b0cb96a

我所用,而不是之前的GUID,它仍然在做同样的即

字符串

.../Movie?movieName=Snatch

我actionlinks被设置如下

<%= Html.ActionLink(parent.Name, "Index", "Catalog", 
    new { category = parent.Name, subCategory = "" }, null)%> 

<%= Html.ActionLink(movie.Name, "Index", "Movie", 
    new { movieId = movie.MovieId }, null)%> 

我的应用程序仍然有效,但我认为这种行为很奇怪。任何帮助都会很棒。

谢谢!

回答

5
routes.MapRoute("Movie", "Movie/{movieId}", 
    new { controller = "Movie", action = "Index", movie = "" }); 

如果路径文本与您提交给mvc链接的属性名称不匹配?

+1

你说得对,他们可能希望改变对ActionLink/RouteLink的调用,而不是改变路线。 – 2009-02-23 21:26:23

4

问题是,当您调用ActionLink时,路由系统找不到要使用的两条路线中的哪条路线,因此它会选择第一条。解决方案是使用RouteLink而不是ActionLink。使用RouteLink可以指定生成URI时要使用的路由的名称。然后,对于使用哪条路线没有歧义。我认为ActionLink已经过时了。我认为没有理由用它来代替RouteLink。

但是,用户提交链接时可能仍然存在问题。在这种情况下,使用路由约束来强制选择正确的路由。

Andrew是正确的(增加表决)您在ActionLink/RouteLink中使用的标记和路线本身必须匹配。