ActionLink无法正常工作,但RouteUrl可以

时间:2008-10-26 17:34:26

标签: asp.net-mvc

我有路线

// 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 beta吗?

由于

唐纳德

4 个答案:

答案 0 :(得分:1)

根据我的经验,动作路线真正正常工作的唯一时间是你只有一条默认路线。一旦你开始添加像你上面的自定义路线,动作路线就会变成......我猜“挑剔”是正确的词。匹配系统无法完全按照您的预期工作。

在这种情况下,您说该操作是“团队”,但此路由与“团队”的操作不匹配,它只匹配“GetTeamByID”。因此,路由系统继续前进并最终为您提供基于默认路由的路由。 teamId并不是默认路由的明确部分,因此它最终会作为最后添加的查询参数。

MVC Beta已发布,此行为未发生变化。

另外,您是否发现命名路线更清晰?就我个人而言。

我甚至更进一步,实际上为我的所有自定义路线创建路线助手,在当前示例中可能如下所示:

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

甚至:

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

您可以直接从模型中提取名称和ID的值。

答案 1 :(得分: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)和类型中的参数匹配。

此时它有点过于“神奇”(在背景中有很多字符串比较!)。希望这会随着时间的推移而改善。旧的表达风格好多了。您基本上调用了您希望运行的方法,并希望传递它的值。我希望他们将表达式风格带回框架中。哈克?

答案 2 :(得分:1)

你试过这个吗?

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

另外

您可能希望在约束中添加action =“GetByTeamID”。

答案 3 :(得分:0)

当参数(在这种情况下为“action”)仅在默认值中定义而不在路径url中定义时,它必须是完全匹配(除非您强制它与RouteUrl情况中的特定路径相反)

为了让一切正常,你可以在上面的路线下面的列表中添加另一条路线:

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

或者您可以将action参数添加到路径网址

或者你可以像你一样使用命名路线。