通过替换当前URL中的操作生成新URL - ASP.NET MVC

时间:2012-02-06 21:52:57

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

我很好奇这是否可能,或者我怀疑,设计不是这样。 在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中,因此在生成新网址时应以某种方式更改操作标记。 (好吧,人们可以用字符串替换来做到这一点,但我想如果有解决方案,它应该比那更好。) 谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

现在我找到了一个解决方案,很简单:

@Url.RouteUrl("RouteName", new { Action = "OtherAction" })

然而,这意味着了解当前使用的路线的名称。由于这不存储在Route对象本身中,因此选择了将该名称存储在路径的DataTokens字典中的hackish解决方案。这似乎没有害处,因为路由是通过服务填充的,所以不需要记住使用DataTokens的惯例。

我想知道是否有更好的解决方案。