Grails:Ajax响应空

时间:2012-10-21 22:05:44

标签: ajax grails

我想在有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时,响应完全为空。只发送标题。

2 个答案:

答案 0 :(得分:1)

对于将返回空白的ajax请求,您返回true或false。您应该使用render函数将模型对象转换为JSON,或者将模型对象转换为JSON并返回它。 您无需检查操作是否被激活;只需返回JSON对象。

答案 1 :(得分:1)

在您model.put("layout", "ajax")之后,您不想返回false,而是true。返回false表示过滤器以某种方式失败并停止所有进一步处理,这将导致返回到浏览器的空响应。如果您返回true,更新的模型将继续通过处理链并在您的gsp中呈现。