【问题标题】:Generate new url by substituting action in current url - ASP.NET MVC通过替换当前 url 中的操作生成新 url - ASP.NET MVC
【发布时间】:2012-02-06 21:52:56
【问题描述】:

我很好奇这是否可能,或者我怀疑,设计上不可能。 在 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) 视图中生成 url(或链接)。这些 url 应该指向 MyController 的另一个动作。

现在的问题是,有多个类似上面的路由注册在不同的 url 下,所以只需使用当前路由值调用 Html.ActionLink() 或 Url.Action() 会产生一个指向路由首先匹配的 url 的链接它。这不一定是当前调用操作的 url。

所以基本上我想要的是采用当前路线并用另一条路线代替行动。我找不到任何方法来做到这一点。 url 可以是任意的,但如有必要,可以应用约束,例如这样 url 必须包含一个操作令牌。实际上它们目前都这样做,所以 url 具有以下结构:

/AnotherArea/SubSegment/{action} // Routes point from other areas to MyArea/MyController

这些 url 存在于视图的 Html.ViewContext.RouteData.Route.Url 中,因此在生成新 url 时应该以某种方式更改操作令牌。 (嗯,可以通过字符串替换来做到这一点,但我想如果有解决方案,它应该比这更好。) 感谢您的宝贵时间!

【问题讨论】:

  • 我习惯了一个段落换行,对不起。添加了三个新的:-)。

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


【解决方案1】:

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

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

但是,这意味着知道当前使用的路线名称。由于它没有存储在 Route 对象本身中,因此我选择了将名称存储在路由的 DataTokens 字典中的那种骇人听闻的解决方案。这似乎没有什么害处,而且由于路由是通过服务填充的,因此不需要记住使用 DataTokens 的约定。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-08
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多