我有一个可以排序,搜索和过滤的列表视图。从该列表视图中,用户可以通过多个步骤编辑项目。最后,在编辑和查看更改后,用户返回列表。现在我希望列表使用用户之前设置的相同排序,搜索词和过滤器,并显示正确的结果。
在显示列表操作时,如何存储和重用多个参数(排序,搜索,过滤器)?
我想到的可能令人不满意的方式:
保存会话对象中的参数。这似乎需要大量代码来处理多个参数(检查参数是否传递给action,存储新值,如果参数未传递,从session获取旧参数,处理空字符串参数):
Long longParameter
if(params.containsKey('longParameter')) {
longParameter = params.getLong('longParameter')
session.setAttribute('longParameter', longParameter)
} else {
longParameter = session.getAttribute('longParameter') as Long
params['longParameter'] = longParameter
}
答案 0 :(得分:3)
如果你想让它更通用,你可以改用Interceptor
。
这或许可以概括为:
class SessionParamInterceptor {
SessionParamInterceptor() {
matchAll() // You could match only controllers that are relevant.
}
static final List<String> sessionParams = ['myParam','otherParam','coolParam']
boolean before() {
sessionParams.each {
// If the request contains param, then set it in session
if (params.containsKey(it)) {
session[it] = params[it]
} else {
// Else, get the value from session (it will be null, if not present)
params[it] = session[it]
}
}
true
}
}
静态sessionParams
包含您要从会话中存储/检索的参数。
如果params
包含列表中的元素,则它以相同的名称存储在session
中。如果没有,则取自session
(假设它存在)。
在您的控制器中,您现在可以像往常一样访问params.getLong('theParam')
。您也可以使用Grails参数转换:
def myAction(Long theParam) {
}
保存了很多LOC。
答案 1 :(得分:1)
使用session
是您最好的选择。只需在首选时保存首选项。我的意思是,当用户排序或过滤时,只需在返回页面之前将该信息保存在特定session
的{{1}}中。下一次,检查<controller>.<action>
,如果它与session
有关,请应用这些内容;否则渲染默认页面。
根据sbglasius, here的建议,您可能希望使用一些<controller>.<action>
。
我希望你明白我的观点。
答案 2 :(得分:1)
我也使用会话。以下是您可以根据自己的需求调整的示例:
mTracker.enableExceptionReporting(true);