有没有办法在MapLink中考虑MapRoute中的URL参数?

时间:2016-08-15 18:59:32

标签: c# asp.net asp.net-mvc-4

我构建了一个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" }
);

在这种情况下,我可以使用上面提供的两种网址架构访问我的应用,但我无法将ActionLinkBeginForm考虑在内。

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

有没有办法实现这一目标,而无需更改每个ActionLinkUrl.ContentBeginForm并在每种情况下用if包围它们?

如何在不更改每个导航代码的情况下使用这两种URL架构?

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

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

修改1

看起来改变这两个MapRoute的位置会使ActionLink按预期工作。不幸的是,Url.Content仍然是错误的。

1 个答案:

答案 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代替。

参考jscss仍使用第二个MapRoute(或者根本不关心路线),但这不是问题。