我想在有ajax请求时更改布局。所以我为此设置了一个过滤器:
class AjaxFilters {
def filters = {
ajaxify(controller: '*', action: '*') {
after = { Map model ->
if(model==null) {
model = new HashMap()
}
// only intercept AJAX requests
if (!request.xhr) {
model.put("layout", "mainUsers")
return true
}
// find our controller to see if the action is ajaxified
def artefact = grailsApplication
.getArtefactByLogicalPropertyName("Controller", controllerName)
if (!artefact) { return true }
// check if our action is ajaxified
def isAjaxified = artefact.clazz.declaredFields.find {
it.name == 'ajaxify'
} != null
def ajaxified = isAjaxified ? artefact.clazz?.ajaxify : []
if (actionName in ajaxified || '*' in ajaxified) {
model.put("layout", "ajax")
return false
}
return true
}
}
}
}
这将创建一个名为“layout”的视图模型,该模型应定义要使用的布局。
以下是使用布局模型的示例视图:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<meta name="layout" content="${layout}"/>
<title>Profile</title>
</head>
<body>
<h3>Edit Profile</h3>
</body>
</html>
这是控制器:
class SettingsController {
def springSecurityService
static ajaxify = ["profile", "account"]
def profile() {
User user = springSecurityService.currentUser
UserProfile profile = UserProfile.findByUser(user)
if(profile == null) {
flash.error="Profile not found."
return
}
[profile: profile, user: user]
}
}
正常请求按预期工作,但是当我尝试ajax时,响应完全为空。只发送标题。
答案 0 :(得分:1)
对于将返回空白的ajax请求,您返回true或false。您应该使用render函数将模型对象转换为JSON,或者将模型对象转换为JSON并返回它。 您无需检查操作是否被激活;只需返回JSON对象。
答案 1 :(得分:1)
在您model.put("layout", "ajax")
之后,您不想返回false
,而是true
。返回false
表示过滤器以某种方式失败并停止所有进一步处理,这将导致返回到浏览器的空响应。如果您返回true
,更新的模型将继续通过处理链并在您的gsp中呈现。