如何在 Html.ActionLink 中获取当前的操作和控制器,并将其用作变量?

10

我需要能够动态检索当前页面的操作和控制器名称,并使用它们创建一个新的HTML.ActionLink,该链接指向相同的操作和控制器名称,但在不同区域中。所以我需要检索当前操作和控制器名称作为变量,在构建新的 HTML.ActionLink 时使用。

因此,如果我在 www.site.com/about 页面上,我需要动态生成一个链接到 www.site.com/es/about 页面。

我基本上在一个单独的区域文件夹中构建了我的网站的西班牙语翻译版本(使用相同命名的控制器、操作和视图,只是内容全部为西班牙语)。我需要用户能够在默认的英语页面(位于根网站视图)和当前页面的西班牙语版本(其视图位于“es”区域文件夹中)之间切换。我不能“硬编码”这些链接,因为我需要在每个页面上使用的共享部分视图中使用它们,即我的_Layout中的_topNavigation。

请让我知道是否需要澄清。我相信使用“区域”并不是本地化应用程序的正确方式,但我仍然努力自学asp.net MVC。我阅读了许多关于本地化的教程和示例,但我无法使它们正常工作或理解它们。

我还应该补充的是,我已经知道如何使用 HTML.ActionLink 在不同区域之间来回切换。我已成功创建了正确的 HTML.ActionLinks 到西班牙(es)区域中的任何视图和默认站点中的任何视图。所以这不是我的问题。

非常感谢您的帮助!谢谢!


1
你提到过区域不是本地化的正确方法,但我想强调一下,它们绝对是使用错误的方法。如果你想要实现本地化,应该将所有需要本地化的内容(大部分用户会看到的文本字符串)存储在某些外部资源中,比如数据库,然后根据用户选择以适当的语言检索内容。采用你目前的方法,你将不得不为每种支持的语言维护一个完全相同的代码副本。 - Drew Gaynor
好的,语言变化不仅仅是字符串,还包括不同的布局和导航。虽然有很多资源文件可能会更难维护,而且我们也不能回到应用程序中更改它以接受这种方式的内容。然后我想通过特定于文化的视图来实现这一点,但我很难让它工作(因为不同的视图引擎等)。所以,在给定的时间内,我只能创建一个区域。 - EPM
此外,他们只会这样做一次 - 网站只会被翻译成西班牙语。 - EPM
也许这与特定问题无关,但另一种选择是定义专门的路由映射来处理URL中的/es/部分。 - Arturo Torres Sánchez
3个回答

16

使用ViewContext.RouteData来确定当前的控制器(Controller)和操作(Action):

@Html.ActionLink("Spanish Version", 
                 ViewContext.RouteData.Values["action"] as String,
                 ViewContext.RouteData.Values["controller"] as String,
                 new { Area = "es" })

太好了,运行得很漂亮!非常非常感谢!!!我唯一需要添加的是:code, new { }code在结尾处。所以它变成了: code @Html.ActionLink("西班牙语版本", ViewContext.RouteData.Values["action"] as String, ViewContext.RouteData.Values["controller"] as String, new { Area = "es" }, new { }) code - EPM
完全没有必要。你可以直接使用@Html.ActionLink("Spanish Version", null, null, new { Area = "es" }, null) - 注意你的代码确实将区域作为路由值添加 - 你需要使用正确的重载并为htmlAttributes添加一个值。 - user3559349

1
尝试这个:

 Html.ActionLink("Espanol", "action", "ControllerName", new { Area = "es" }, null)

谢谢你的帮助。不幸的是,这需要更多的工作。我实际上需要以编程方式获取当前页面的控制器名称和操作(对于任何页面),并从中创建一个指向具有相同名称和操作的控制器的新链接,但仅在“es”区域内。例如:某人从根目录下的“关于”控制器进入“where-to-buy”视图,系统会获取此信息并创建一个新链接到“关于”控制器中的“where-to-buy”视图,但在“es”区域内。不知道还有什么其他的解释方法?我希望这样说得清楚。 - EPM
或者,也许有人可以告诉我如何在HTML.ActionLink中使用变量作为操作和控制器名称?这可能吗?我知道你可以在末尾附加变量,但是你能否使用变量作为操作和控制器名称? - EPM

0
如果actionName仅用于@Html.ActionLink(),您可以简单地将"null"作为actionName传递。当前的actionName将被使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接