我有路线
// 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吗?
由于
唐纳德
答案 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参数添加到路径网址
或者你可以像你一样使用命名路线。