2008-10-26 78 views
4

我有一个路线ActionLink的不是工作,但RouteUrl确实

// Sample URL: /Fixtures/Team/id 
routes.MapRoute(
    "Fixtures-by-TeamID", 
    "Fixtures/Team/{teamId}", 
    new { controller = "Fixtures", action = "GetByTeamID", }, 
    new { teamId = @"\d{1,3}" } 
); 

,我试图在ASP.net MVC P5使用ActionLink的。

<%= Html.ActionLink(g.HomeTeam.TeamName, "Team", new { teamId = g.HomeTeam.TeamID })%> 

但是它不工作,并给我

<a href="/Fixtures/Team?teamId=118">Team A</a> 

如果我使用Url.RouteUrl我得到正确的链接。

<a href="<%=Url.RouteUrl("Fixtures-by-TeamID", new { teamId = g.HomeTeam.TeamID })%>"><%=g.HomeTeam.TeamName%></a> 

<a href="/Fixtures/Team/118">Team A</a> 

任何帮助将是伟大的?这将改变ASP.net MVC测试版吗?

感谢

唐纳德

回答

1

以我的经验,唯一的一次行动路线真的正常工作是当你只有单一的默认路由。只要你开始添加像你上面的自定义路线,行动路线变成......我猜“finicky”是正确的词。匹配系统无法完全按照您预期的方式工作。

在这种情况下,你说的行为是“团队”,但是这条路线与“团队”的行为不匹配,它只匹配“GetTeamByID”。因此,路由系统继续前进,并最终为您提供基于默认路由的路由。 teamId并不是你的默认路由的一部分,所以它最终作为一个查询参数结束。

MVC Beta已发货,并且此行为不变。

另外,你不觉得指定的路线更清晰吗?我个人认为。

我甚至走一步,实际上我所有的定制路线,这可能看起来像这样在当前的例子创建路线助手:

<a href="<%= Url.FixturesByTeam(g.HomeTeam.TeamID) %>"><%= g.HomeTeam.TeamName %></a> 

甚至:

<%= Html.LinkToFixturesByTeam(g.HomeTeam) %> 

,你可以直接从模型中获取名称和ID的值。

1

试试这个:

// Sample URL: /Fixtures/Team/id 
routes.MapRoute(
    "Fixtures-by-TeamID", 
    "Fixtures/Team/{teamId}", 
    new { controller = "Fixtures", action = "Team", teamId = -1 } 
); 

控制器应该是这样的:

public class FixturesController : BaseController // or whatever 
{ 
    /*...*/ 
    public ActionResult Team(int teamId) 
    { 
    return View("Detail", Team.GetTeamById(teamId)) // or whatever 
    } 
    /*...*/ 
} 

而且你的链接看起来像

<%= Html.ActionLink("Click here for the team details", "Team", "Fixtures", new { teamId = ViewModel.Data.Id /*orwhateverlol*/ }) %> 

(我没有MVC这台机器上所以这全部来自内存;可能有语法错误或反转一些参数)。

请注意您的路线图的路径匹配您的1)控制器,2)动作3)参数名称。我发现默认动作(MapRoute中的第三个参数)有效,而您从未见过的那种方法的重载(可能是前一版本的延期)。

还要观察FixturesController如何匹配路径(Fixtures)和动作名称匹配(Team),以及参数是否匹配(teamId)。

最后,您的ActionLink的最后一个参数必须与名称(teamId)和类型中的控制器参数相匹配。

在这一点上它有点“神奇”(有很多字符串比较在后台进行!)。希望这会随着时间的推移而改善。旧的表现风格要好得多。你基本上称之为你希望运行的方法,以及你希望通过的值。我希望他们能够将这种表达风格带回到框架中。哈克?

+0

“表现风格”在幕后产生了相同的魔法字符串,并带有相同的关联匹配问题。是否“更好”是品味的问题;个人而言,我发现模拟一个动作方法的调用只是为了得到它的名字是令人震惊的。 – 2008-10-26 19:11:46

0

当一个参数(在本例中为“action”)仅在默认值中定义,而不在路径url中定义时,它必须是完全匹配的(除非强制它违背RouteUrl案例中的特定路线)。

,使一切工作的是现在,你可以另一条路线添加到列表中只是上面的路线如下:

routes.MapRoute( “灯具按TeamID1”, “赛程/团队/ {teamId}“, new {controller =”Fixtures“,action =”Team“,}, new {teamId = @”\ d {1,3}“} );

,或者你可以动作参数添加到路由URL,

或像你一样,你可以使用指定的路线。

1

你试过这个吗?

Html.ActionLink<FixturesController>(c => c.GetByTeamID(g.HomeTeam.TeamID), "Team") 

而且

您可能要行动= “GetByTeamID” 添加到您的约束。