2

我有一个 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路由,而不是of Default, 生成索引操作的 URL。

我当然可以强制一个合适的锚做这样的事情:

@Html.RouteLink(
     "All applications", 
     "Default", 
      new { controller = "Application", action = "Index"})

但这感觉就像我正在治愈症状而不是实际问题。我也失去了对所有锚点进行编译时检查的美感,所以我宁愿做其他事情。

在视图中生成锚点时,有没有办法强制 T4MVC 忽略当前页面的参数?或者我可以以某种方式修改我的路线以避免这种行为吗?

4

2 回答 2

1

“T4MVC 识别出当前页面的路由中有一个可用的应用程序 ID 并使用该 ID,因此它可以使用 DefaultWithId 路由而不是 Default 来生成指向 index-action 的 URL”

T4MVC 没有这样的智能,而是这些智能内置在 MVC 路由系统中。但是许多 T4MVC 用户之前遇到过这种情况。各种参考:

于 2013-01-14T19:41:38.657 回答
0

为什么不将操作方法​​设置为 id 参数为空。像这样:

public virtual ActionResult xyz(int? id)
{
  return View();
}

现在,当您需要传递时传递 id,否则离开它。希望它能解决你的问题。

于 2013-01-14T06:04:29.027 回答