在视图中生成新锚点时,是否可以强制T4MVC不从当前视图的URL中获取参数?

时间:2013-01-13 20:00:42

标签: c# asp.net asp.net-mvc routes t4mvc

我有一个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忽略当前页面的参数?或者我可以以某种方式修改我的路线以避免这种行为吗?

2 个答案:

答案 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,否则就离开它。希望它能解决你的问题。