diff --git a/grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/taglib/ApplicationTagLibTests.groovy b/grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/taglib/ApplicationTagLibTests.groovy
index 3cb69cee297..f6710d0584e 100644
--- a/grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/taglib/ApplicationTagLibTests.groovy
+++ b/grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/taglib/ApplicationTagLibTests.groovy
@@ -796,4 +796,22 @@ class ApplicationTagLibTests extends AbstractGrailsTagTests {
appCtx.getBean(FormTagLib.name).requestDataValueProcessor = null
}
}
+
+ void testCreateLinkWithUriAndParams() {
+ unRegisterRequestDataValueProcessor()
+ def template = ''''''
+ assertOutputEquals '/some/path?width=21&height=12', template
+ }
+
+ void testCreateLinkWithParamsAndUriContainsRequestParams() {
+ unRegisterRequestDataValueProcessor()
+ def template = ''''''
+ assertOutputEquals '/some/path?name=JSB&width=21&height=12', template
+ }
+
+ void testUrlEncodingParamsCreateLinkWithUri() {
+ unRegisterRequestDataValueProcessor()
+ def template = ''''''
+ assertOutputEquals '/some/path?some+height=12&name=Jeff+Brown', template
+ }
}
diff --git a/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultLinkGenerator.groovy b/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultLinkGenerator.groovy
index d3ef516bcd5..ac871708836 100644
--- a/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultLinkGenerator.groovy
+++ b/grails-web/src/main/groovy/org/codehaus/groovy/grails/web/mapping/DefaultLinkGenerator.groovy
@@ -17,6 +17,7 @@ package org.codehaus.groovy.grails.web.mapping
import grails.util.Environment
import grails.util.GrailsNameUtils
+import grails.util.GrailsWebUtil
import grails.web.UrlConverter
import groovy.transform.CompileStatic
import groovy.transform.TypeCheckingMode
@@ -105,7 +106,21 @@ class DefaultLinkGenerator implements LinkGenerator, PluginManagerAware {
writer << cp
}
}
- writer << attrs.get(ATTRIBUTE_URI).toString()
+ def uri = attrs.get(ATTRIBUTE_URI).toString()
+ writer << uri
+
+ def paramsAttribute = attrs.get(ATTRIBUTE_PARAMS)
+ Map params = paramsAttribute && (paramsAttribute instanceof Map) ? (Map)paramsAttribute : null
+ if(params) {
+ def charset = GrailsWebUtil.DEFAULT_ENCODING
+ def paramString = params.collect { k, v ->
+ def encodedKey = URLEncoder.encode(k as String, charset)
+ def encodedValue = URLEncoder.encode(v as String, charset)
+ "$encodedKey=$encodedValue"
+ }.join('&')
+ writer << (uri.indexOf('?') >= 0 ? '&' : '?')
+ writer << paramString
+ }
}
else if (attrs.get(ATTRIBUTE_RELATIVE_URI) != null) {
String relativeUri = attrs.get(ATTRIBUTE_RELATIVE_URI)