我构建了一个Web应用程序,其中RouteConfig.cs
是默认的。
现在我收到了一个任务,我需要在URL的开头附加客户跟踪ID,但保留其不存在时的相同功能。
http://localhost:60202/Home/Index //通用客户 http://localhost:60202/Location/123/Home/Index //包含客户跟踪ID的网址
此代码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" }
);
在这种情况下,我可以使用上面提供的两种网址架构访问我的应用,但我无法将ActionLink
和BeginForm
考虑在内。
@Html.ActionLink("Início", "Index", "Home") //this should have full URL info
有没有办法实现这一目标,而无需更改每个ActionLink
,Url.Content
和BeginForm
并在每种情况下用if
包围它们?
如何在不更改每个导航代码的情况下使用这两种URL架构?
我们目前实施的方法是复制 IIS 中的文件夹,因为截至今天只有4个文件夹,但在不久的将来,维护可能会很麻烦。
我不知道为什么,但根据this问题它应该开箱即用。
修改1
看起来改变这两个MapRoute
的位置会使ActionLink
按预期工作。不幸的是,Url.Content
仍然是错误的。
答案 0 :(得分:0)
嗯,这令人尴尬,但看起来你添加路线的顺序有所不同。所以我改为:
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
开始按预期工作。我仍然遇到了我在Ajax调用中使用的Url.Content
的问题。
在这种情况下,我发现我应该使用Ulr.Action
代替。
参考js
和css
仍使用第二个MapRoute
(或者根本不关心路线),但这不是问题。