我很好奇这是否可能,或者我怀疑,设计不是这样。 在ASP.NET MVC项目中,我有多条这样的路由:
new Route(
url, // This can be arbitrary
new RouteValueDictionary {
{"area", "MyArea"},
{"controller", "MyController"},
{"action", "Index"}
},
new RouteValueDictionary(),
new RouteValueDictionary {
{"area", "MyArea"},
},
new MvcRouteHandler()))
我想在MyController的操作所使用的(Razor)视图中生成网址(或链接)。这些网址应该指向MyController的另一个动作。
现在的问题是,上面有多条路由在不同的网址下注册,所以简单地用当前路由值调用Html.ActionLink()或Url.Action()会产生一个链接,指向路由首先匹配的网址它。这不一定是当前调用动作的URL。
所以基本上我想要的是采用当前路线并用另一个路线替换动作。我找不到任何办法。 网址可以是任意的,但是如果需要,可以应用约束,例如,这样url必须包含一个动作令牌。实际上所有这些都是当前的,所以网址具有以下结构:
/AnotherArea/SubSegment/{action} // Routes point from other areas to MyArea/MyController
这些网址位于视图的Html.ViewContext.RouteData.Route.Url中,因此在生成新网址时应以某种方式更改操作标记。 (好吧,人们可以用字符串替换来做到这一点,但我想如果有解决方案,它应该比那更好。) 谢谢你的时间!
答案 0 :(得分:0)
现在我找到了一个解决方案,很简单:
@Url.RouteUrl("RouteName", new { Action = "OtherAction" })
然而,这意味着了解当前使用的路线的名称。由于这不存储在Route对象本身中,因此选择了将该名称存储在路径的DataTokens字典中的hackish解决方案。这似乎没有害处,因为路由是通过服务填充的,所以不需要记住使用DataTokens的惯例。
我想知道是否有更好的解决方案。