所以我需要将javascript变量传递给grails参数来构建和下载文件。所以最初用ajax做这个只是为了得知ajax没有做下载。最初这样的工作原理如下:
<script type="text/javascript" charset="utf-8">
function myFunction() {
jQuery.ajax({
url: "Search/download",
type: "POST",
data: {facets: visualSearch.searchQuery.facets()}
});
}
</script>
<input type="button" onclick="myFunction()" value="download">
虽然这正确地传递了映射,但这并没有进行下载。
所以现在我想用g:link
<g:link controller="Search" action="test" params="[facets: '\$(visualSearch.searchQuery.facets())']" >TEST GRAILS</g:link>
但我在控制器中的所有参数都是
facets=$(visualSearch.searchQuery.facets())
action=test
controller=search
如何修复此问题以将facet(无论是已解析还是未解析)传递到控制器中。谢谢!
答案 0 :(得分:3)
在params
中添加javascript变量无效。 g:link
在服务器端执行,不知道您的javascript值。您可以删除此params
,而是在链接的“onclick”事件中添加代码,以便在参数中设置您的javascript值。
像: 在gsp页面中,
<g:link name="searchLink" controller="Search" action="test">TEST GRAILS</g:link>
然后在javascript(在同一页面中),
$(function() {
$('a[name="searchLink"]').bind('click', function() {
$(this).attr('href', $(this).attr('href') + '?facets=' + visualSearch.searchQuery.facets());
})
})
基本上你使用Grails来生成超链接,然后使用JQuery将带有参数的查询字符串附加到该href
希望有所帮助。
答案 1 :(得分:1)
在这些情况下我倾向于使用g:link
来生成URL,但是然后使用jQuery覆盖默认行为以进行ajax调用:
<g:link class="searchLink" controller="Search" action="test" params="[facets: '\$(visualSearch.searchQuery.facets())']" >TEST GRAILS</g:link>
$('.searchLink').on('click', function(e) {
e.preventDefault(); // prevent default link behavior
var $element = $(this);
var url = $element.prop('href');
$.post(url, function(data) {
// callback if you need it
});
});
答案 2 :(得分:0)
根据您的想法,我认为您应该创建一个表单并在点击事件中提交:
<script type="text/javascript" charset="utf-8">
function myFunction() {
$('<form>', {
"html": '<input type="text" name="facets" value="' + visualSearch.searchQuery.facets() + '" />',
"action": '${createLink(controller: "Search", action: "test")}',
"method": 'POST'
}).appendTo(document.body).submit();
}
</script>
<input type="button" onclick="myFunction()" value="download">
或重构您的代码以获得真正的html表单并在提交之前为其准备数据。