我有一个ASP.Net MVC4应用程序,我使用T4MVC在我的视图中方便地生成锚元素。像这样:
@Html.ActionLink("Application 1", MVC.Application.Overview(1))
我的RouteConfig中有两条路线:
routes.MapRouteLowercase(
name: "DefaultWithId",
url: "{controller}/{id}/{action}/{subaction}",
constraints: new { id = @"\d+" },
defaults: new { subaction = UrlParameter.Optional }
);
routes.MapRouteLowercase(
name: "Default",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
);
我有一个应用程序控制器,其中某些操作需要Id到某个应用程序,而其他操作不需要Id,因为它们不是特定于应用程序(如显示所有应用程序的页面)。
路线在大多数情况下运作良好,产生如下链接:
/application/index <-- Overview of all applications
/application/1/overview <-- Overview of specific application
当我在/application/1/overview
上并尝试创建一个锚元素回到索引操作时,会出现问题。然后生成的链接以/application/1/index
结束,这不是期望的行为。
如果我错了,请纠正我,但我认为这里发生的是T4MVC认识到当前页面的路线中有一个应用程序ID可用并使用该ID,因此它可以使用DefaultWithId
路由,而不是Default
,以生成索引操作的URL。
我当然可以强迫一个合适的锚做这样的事情:
@Html.RouteLink(
"All applications",
"Default",
new { controller = "Application", action = "Index"})
但这感觉就像我在治疗症状而不是实际问题。我也放弃了所有锚点编译时检查的美妙,所以我宁愿做别的事。
在视图中生成锚点时,是否有办法强制T4MVC忽略当前页面的参数?或者我可以以某种方式修改我的路线以避免这种行为吗?
答案 0 :(得分:1)
“T4MVC识别当前页面的路由中有可用的应用程序ID并使用该ID,以便它可以使用DefaultWithId路由而不是Default来生成索引的URL -action“
T4MVC没有这样的智能,而是将这些智能内置到MVC路由系统中。但是之前有很多T4MVC用户遇到过这种情况。各种参考文献:
答案 1 :(得分:0)
为什么不让action方法将id参数设为null。像这样:
public virtual ActionResult xyz(int? id)
{
return View();
}
现在只要你需要通过就传递id,否则就离开它。希望它能解决你的问题。