Url.Action没有给出预期的结果.不需要的路线值仍然存在

Øyv*_*hen 6 url routes asp.net-mvc-3

我有一个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
);
Run Code Online (Sandbox Code Playgroud)

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

Url.Action("Index","Systems")
Url.Action("Index","Carriers")
Run Code Online (Sandbox Code Playgroud)

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

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

我已经尝试了很多东西来保持链接不使用路由值中的名称,但无济于事.我遇到的最奇怪的情况是我试过这个:

Url.Action("Index","Systems", new{name = (string)null})
Run Code Online (Sandbox Code Playgroud)

现在链接显示为

/System?name=MySystem
Run Code Online (Sandbox Code Playgroud)

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

nem*_*esv 6

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

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

所以Url.Action在你看来之前打电话给你:

Url.Action("Index","Systems")
Url.Action("Index","Carriers")
Run Code Online (Sandbox Code Playgroud)

取出预充式nameRequestContext:

@{
     Request.RequestContext.RouteData.Values.Remove("name");
}
Run Code Online (Sandbox Code Playgroud)

这也是一种解决方法,但如果您通过为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 }
);
Run Code Online (Sandbox Code Playgroud)

你原来的解决方案("归零"的nameUrl.Action)也将工作:

@Url.Action("Index", "Systems" , new {name = (string)null} )
Run Code Online (Sandbox Code Playgroud)