【问题标题】:Get current action and controller and use it as a variable in an Html.ActionLink?获取当前动作和控制器并将其用作 Html.ActionLink 中的变量?
【发布时间】:2013-11-15 17:53:37
【问题描述】:

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

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

我基本上在一个单独的区域文件夹中构建了我的网站的西班牙语翻译版本(具有相同名称的控制器、操作和视图,只是内容都是西班牙语)。我需要用户能够在页面的英文版本(这是默认设置,并且驻留在根站点视图中)和西班牙语版本(其视图驻留在区域文件夹“es”中)之间来回切换他们当前在哪个页面上。我无法“硬编码”这些链接,因为我需要在共享的局部视图中使用它,即每个页面上使用的 _Layout 中的 _topNavigation。

如果我需要澄清,请告诉我。我确信在本地化应用程序时使用“区域”并不是真正的方法,但我仍在努力自学 asp.net MVC。我阅读了许多关于本地化的教程和示例,但我无法让它们发挥作用或有意义。

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

非常感谢任何帮助!谢谢!

【问题讨论】:

  • 您提到您知道区域不是本地化的方法,但我想强调它们绝对是错误的使用方法。如果您想实现本地化,您应该将所有需要本地化的内容(大部分将显示给用户的文本字符串)存储在一些外部资源(如数据库)中,然后在适当的位置检索内容基于用户选择的语言。使用您当前的方法,您必须为您支持的每种语言维护一个相同的代码副本。
  • 嗯,不仅仅是字符串会随着语言的变化而变化,还有不同的布局和导航。认为使用许多资源文件可能会更难维护,我们也不能回到应用程序并更改它以接受这种方式的内容。然后我认为实际上通过特定于文化的视图来做到这一点会更有意义,但我很难让它发挥作用(使用不同的视图引擎等)。所以,在给定的时间内,我只好创建一个区域。
  • 另外,他们只会这样做一次 - 该网站只会被翻译成西班牙语。
  • 也许它与这个特定问题无关,但另一种选择是定义处理 URL 的 /es/ 部分的特殊路由映射。

标签: asp.net-mvc controller toggle asp.net-mvc-areas html.actionlink


【解决方案1】:

使用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("Spanish Version", ViewContext.RouteData.Values["action"] as String, ViewContext.RouteData.Values["controller"] as String, new { Area = "es" }, 新的 { }) code
  • 这完全没有必要。您可以只使用@Html.ActionLink("Spanish Version", null, null, new { Area = "es" }, null) - 请注意您的代码确实将区域添加为路线值 - 您需要使用正确的重载并为htmlAttributes添加一个值
【解决方案2】:

试试这个:

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

【讨论】:

  • 感谢您的帮助。不幸的是,它涉及更多。我实际上需要以编程方式获取某人所在的当前页面的当前控制器名称和操作(对于任何页面) - 并从中创建一个指向具有相同名称和操作的控制器的新链接 - 仅在“es “ 区域。例如:有人从根中的“关于”控制器进入“购买地点”视图,系统获取此信息并从“关于”控制器创建到购买地点视图的新链接,但在“es”区域。不知道还能怎么解释?我希望这是有道理的。
  • 或者,也许有人能告诉我一种在 HTML.ActionLink 中使用变量作为动作和控制器名称的方法吗?那可能吗?我知道你在最后附加了变量,但是你可以为动作和控制器名称使用变量吗?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    相关资源
    最近更新 更多