6

我有一个带有多条路线的 MVC3 应用程序。其中两个定义如下:

routes.MapRoute(
  null,
  "System/{name}", // URL with parameters
  new { controller = "Systems", action = "Index" } // Parameter defaults
);
routes.MapRoute(
  null,
  "Carrier/{name}", // URL with parameters
  new { controller = "Carriers", action = "Index" } // Parameter defaults
);

现在,在我的菜单中,我有两个指向使用 Url.Action 创建的这些路由的链接:

Url.Action("Index","Systems")
Url.Action("Index","Carriers")

现在,当我启动应用程序时,一切似乎都很好,菜单中的链接显示为/System//Carrier/,这是预期值。

但是,当我浏览到例如/System/MySystem在网页中时,我仍然希望链接指向同一个地方,但现在它们指向/System/MySystemand /Carrier/MySystem

我已经尝试了很多方法来阻止链接使用路由值中的名称,但无济于事。我遇到的最奇怪的情况是当我尝试这个时:

Url.Action("Index","Systems", new{name = (string)null})

现在链接显示为

/System?name=MySystem

这里有什么好的方法来确保路由值中的名称值不会以任何方式干扰这些链接吗?

4

1 回答 1

6

正如您所注意到的,Url.帮助程序重用了先前给定的路由参数。

作为一种解决方法(我希望有一个更优雅的解决方案......),您可以从您的视图中删除该name条目:RouteData.Values

因此,在您认为给您打电话之前Url.Action

Url.Action("Index","Systems")
Url.Action("Index","Carriers")

name从中删除预填充RequestContext

@{
     Request.RequestContext.RouteData.Values.Remove("name");
}

name这也是一种解决方法,但如果您稍微修改您的路线并为您的分段提供默认空值:

routes.MapRoute(
  null,
  "System/{name}", // URL with parameters
  new { controller = "Systems", action = "Index", name = (string)null }
);
routes.MapRoute(
  null,
  "Carrier/{name}", // URL with parameters
  new { controller = "Carriers", action = "Index", name = (string)null }
);

您的原始解决方案(“归零”name中的Url.Action)也将起作用:

@Url.Action("Index", "Systems" , new {name = (string)null} )
于 2012-09-07T15:20:21.627 回答