是否有一种方法使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模式访问我的应用程序,但我无法使ActionLink
和BeginForm
考虑到这一点。
@Html.ActionLink("Início", "Index", "Home") //this should have full URL info
有没有一种方法可以实现这一目标,而不需要改变每个ActionLink
, Url.Content
和BeginForm
,并在每种情况下用if
包围它们?
我怎么能同时使用URL模式而不改变每个导航代码?
我们目前实现的方法是复制IIS中的文件夹,因为今天只有4个文件夹,但在不久的将来,维护它可能会很麻烦。
我不知道为什么,但是根据这个问题,它应该是开箱即用的。
编辑1
看起来改变这两个MapRoute
的位置使ActionLink
像我预期的那样工作。不幸的是,Url.Content
仍然有bug。
嗯,这很尴尬,但看起来你添加路由的顺序是不同的。所以我改成了:
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
来代替。
参考js
和css
仍然使用第二个MapRoute
(或者甚至不关心路由),但这不是问题。