我的问题是后端服务器(用grails编写)会自动将我的请求URL转换为不同的URL。具体来说,它正在将其从/ UXChallengeAwards / processSelectedNotifications更改为/ UXChallengeAwards / index。
-
在模板gsp文件中,我定义了一个按钮,当点击它时会调用jQuery ajax:
<button class="blue-link"
onclick="jQuery.ajax({type:'POST',
data:jQuery(this).parents('.multiSelectForm').serialize(),
url: '/ici/UXChallengeAwards/processSelectedNotifications/${challenge.id}',
success:function(data,textStatus){},
error:function(xhr,textStatus,errorThrown){}
})" >
方法UXChallengeAwardsController.processSelectedNotifications存在。它执行一些工作,然后重定向到控制器中的另一个操作。事实上,这曾经工作过。但不知何故,在添加第二个按钮的过程中,我做了一个改变,似乎已经破坏了。
现在单击该按钮时,请求URL将切换到/ ici / UXChallengeAwards / index并返回404,因为索引不存在于此控制器中的操作。
我已经google了,最常见的答案是控制器必须为视图返回一些结果。但是我在控制器中看到了很多重定向的例子,我看不出我做错了什么。 (我确实尝试过渲染结果的变体,但没有成功。)
以下是我的控制器操作:
def processSelectedNotifications = {
def challenge
def checkboxes = params.list('selectCheckbox');
for (checkbox in checkboxes) {
// the checkbox contains the id of a ChallangeAward that should be published
ChallengeAwards challengeAwards = ChallengeAwards.get(checkbox.toInteger())
if (challengeAwards) {
// grab a challenge for use in the redirect, they are all the same
challenge=challengeAwards.challenge
publish(challengeAwards)
}
}
if (challenge) {
redirect action: 'challengeAwardsRemote', id: challenge.id
return
}
// render a failure message if we got here
render messageNS(code:"UX.ChallengeAwards.Publish.failure")
}
我真的很感激任何可能出错的见解,或者如何处理这个问题。我已经检查了我的UrlMappings,这是应该处理此控制器/方法请求的规则:
"/$controller/$action?/$id?"{ constraints {} }
非常感谢!
答案 0 :(得分:0)
我将继续回答我自己的问题,以防它对其他新手有帮助。
事实证明我没有得到自动重定向。相反,我在按钮设置代码中出错,因此grails使用其默认链接行为。 (这是转到与视图匹配的控制器,如果未指定任何操作,请使用索引方法。)
上面的代码最初是使用remoteSubmit标记创建的,但我发现生成的代码不支持在单个页面上处理多个表单。所以,我复制了生成的代码,然后调整它来处理多个表单。但是,我希望样式与页面上已有的样式相匹配,因此我将其切换为按钮。事情出了差错的时候。
最终,我最终为按钮指定了onClick函数,然后在javascript中编写了ajax提交代码。结果证明要简单得多。
以下是按钮规范的结果:
<button type="submit" id="notifications" class="blue-link" >
<i class="fa fa-envelope-o"></i>
<g:messageNS
code="UX.DiscussionBoard.ChallengeAward.Button.notify" />
</button>
以及相关的JavaScript:
jQuery(document).ready(function() {
var clkBtn = "";
jQuery('button[type="submit"]').click(function(evt) {
clkBtn = evt.target.id;
});
jQuery('.multiSelectForm').submit(function() {
var url = '/ici/UXChallengeAwards/processSelectedNotifications';
if (clkBtn == 'deletes') {
url ='/ici/UXChallengeAwards/processSelectedDeletes';
}
var errorTarget = jQuery(this).parents().find('.recipientMessage').val();
var requestData = jQuery(this).parents('.multiSelectForm').serialize();
var options = {
data : requestData,
type : 'POST',
url : url,
target : '#awardsTab',
error : function(data) {
jQuery('#' + errorTarget).html(data.responseText).show();
},
success : function(data) {
console.log("in success");
}
};
jQuery(this).ajaxSubmit(options);
return false;
});