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

本文关键字:视图 T4MVC 获取 参数 URL 我可以 | 更新日期: 2023-09-27 17:52:37

我有一个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忽略当前页面的参数,在视图中生成锚点时?或者我可以修改我的路由以避免这种行为?

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

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

T4MVC没有这样的智能,但是它们被内置到MVC路由系统中。但是许多T4MVC用户以前就遇到过这种情况。各种引用:

  • T4MVC可选参数值从当前上下文隐含
  • https://t4mvc.codeplex.com/discussions/399824

为什么不让action方法的id参数为空呢?这样的:

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

现在在需要传递的时候传递id,否则将其保留。