是否有一种方法使URL参数在MapRoute被考虑在ActionLink

本文关键字:MapRoute 参数 ActionLink URL 方法 一种 是否 | 更新日期: 2023-09-27 18:02:25

我构建了一个web应用程序,其中RouteConfig.cs是默认的。

现在我收到了一个任务,我需要在URL的开头附加一个客户跟踪ID,但在它不存在时保持相同的功能。

http://localhost:60202/Home/Index//通用客户http://localhost:60202/Location/123/Home/Index//带有客户跟踪id的URL

这个代码123是一个跟踪ID,我的客户知道他发起呼叫到我的页面的位置。我没有权力要求他们改变这一点,因为他们在全球使用。

我尝试用这个自定义路由实现这个:

routes.MapRoute(
    name: "Route",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute(
    name: "Default",
    url: "Location/{trackingId}/{controller}/{action}",
    defaults: new { trackingId = 0, controller = "Home", action = "Index" }
);

在这种情况下,我可以使用上面提供的URL模式访问我的应用程序,但我无法使ActionLinkBeginForm考虑到这一点。

@Html.ActionLink("Início", "Index", "Home") //this should have full URL info 

有没有一种方法可以实现这一目标,而不需要改变每个ActionLink, Url.ContentBeginForm,并在每种情况下用if包围它们?

我怎么能同时使用URL模式而不改变每个导航代码?

我们目前实现的方法是复制IIS中的文件夹,因为今天只有4个文件夹,但在不久的将来,维护它可能会很麻烦。

我不知道为什么,但是根据这个问题,它应该是开箱即用的。

编辑1

看起来改变这两个MapRoute的位置使ActionLink像我预期的那样工作。不幸的是,Url.Content仍然有bug。

是否有一种方法使URL参数在MapRoute被考虑在ActionLink

嗯,这很尴尬,但看起来你添加路由的顺序是不同的。所以我改成了:

routes.MapRoute(
    name: "Default",
    url: "Location/{trackingId}/{controller}/{action}",
    defaults: new { trackingId = 0, controller = "Home", action = "Index" }
);
routes.MapRoute(
    name: "Route",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

随着这个变化,每个ActionLink开始像我预期的那样工作。我仍然有Url.Content的问题,我在Ajax调用中使用。

在这种情况下,我发现我应该使用Ulr.Action来代替。

参考jscss仍然使用第二个MapRoute(或者甚至不关心路由),但这不是问题。