2012-10-21 100 views
0

我想在發生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 
     } 
    } 
} 
} 

這將創建一個名爲「佈局」,它應該確定使用何種佈局視圖模型。

這裏是使用佈局模型的示例圖:

<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一個響應完全是空的。只發送標題。

回答

1

在您的model.put("layout", "ajax")之後,您不想返回false而是true。返回false表示過濾器以某種方式失敗,並暫停所有進一步的處理,這將導致返回給瀏覽器的空響應。如果你返回true,更新後的模型將繼續貫穿整個處理鏈並呈現在你的gsp中。

1

對於將返回空白的ajax請求,您返回true或false。您應該使用渲染函數將模型對象轉換爲JSON,或將模型對象轉換爲JSON並將其返回。 您不需要檢查操作是否已被激活;只是返回JSON對象。

+0

我不想返回JSON,我想呈現爲正常的HTML視圖 – Chris