【问题标题】:Grails <g:link> rewriting links to match UrlMappings instead of controller/actionGrails <g:link> 重写链接以匹配 UrlMappings 而不是控制器/动作
【发布时间】:2021-09-07 01:08:57
【问题描述】:

目前使用 grails 4.0.3。

我正在尝试使用简单的&lt;g:link&gt; 标签生成指向控制器操作的链接:

<g:link controller="myController" action="myAction" params="[someParam:'myValue']">Link text</g:link>

在我的 UrlMappings 文件中,我将此控制器映射到用于外部调用的通用 URL。此映射会强制执行一些我想要在进行此映射时强制执行的参数:

class UrlMappings {
  static mappings = {
    "/service/someExposedUrl" {
      controller = "myController"
      action = "myAction"
      someParam = "defaultValue"
    }
  }
}

但是,在我的应用程序中写入页面的链接是使用 UrlMapping 定义编写的。

http://serverUrl/service/someExposedUrl?someParam=<ignored>

而不是

http://serverUrl/myController/myAction?someParam=myValue

在这种情况下,/service URL 上的参数将被忽略,因为它们在 UrlMapping 中是硬编码的。

有没有办法强制 grails 链接到指定的控制器/动作而不是映射?

【问题讨论】:

  • "有没有办法强制 grails 链接到指定的控制器/动作而不是映射?" - 您描述的行为是故意的。使用g:link 标记的部分目的是利用反向url 查找,因此您不必对URI 进行硬编码。如果您不希望发生反向 url 映射,可以使用 &lt;g:link uri='myController/myAction'&gt; 之类的东西。

标签: grails


【解决方案1】:

结合使用自定义 URL 映射和原始 URLMappings 中的 exclude 关键字,您可能会获得所需的内容。

创建 MyControllerUrlMappings。本指南提供了几个不同写法的示例。我发现它很有帮助。

class MyControllerUrlMappings {

    static mappings = {
    
        // Url Mappings specific only to this controller
        
    }
}

https://guides.grails.org/grails_url_mappings/guide/index.html#_multiple_urlmappings_files

尽管如此,您的应用仍将运行原始 UrlMappings 文件。因此,您将拥有新的自定义 Url 映射和默认映射。要解决这个问题,您可以在原始 UrlMappings 文件中排除您的控制器及其方法。

class UrlMappings {

    static excludes = [
            "/myController",
            "/myController/*"
    ]

    static mappings = {...}
    ...

没有我想要的那么优雅,但在类似的情况下,这就是我的工作方式。

【讨论】:

    【解决方案2】:

    预先警告:我没有针对这种特定情况进行测试,尽管我已经单独使用了这些部件。第二个警告:得知有更好的方法可以做到这一点,我不会感到惊讶...grails 有时有很多选择!

    您应该能够在 UrlMappings 中创建命名映射,然后在 createLink 中引用它。

    网址映射:

    name arbitraryName: "/myController/myAction" {
        controller = "myController"
        action = "myAction"
    }
    

    链接:

    <g:link mapping="arbitraryName" params="[someParam:'myValue']">Link text</g:link>
    

    【讨论】:

    • 这当然有效,如果在接受此答案之前有其他建议,请保持打开状态
    • @Trebla 在问题中您明确表示您不想使用映射。
    • 我将其理解为“不想使用 /service 映射”而不是“根本不想使用映射”。也许这是错误的。
    • 虽然我“希望”有一个直接指向 /myController/myAction 的链接,但我主要关心的是避免使用现有的“/someService/someExposedUrl”映射,因为这会添加一个默认参数。 Daniel 建议使用不同的映射就足够了,尽管我不希望只为这种情况定义额外的映射。我愿意接受其他建议(例如,强制
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多