如何存储要在以后再次使用的操作参数

时间:2016-10-20 08:41:38

标签: session grails request parameter-passing

我有一个可以排序,搜索和过滤的列表视图。从该列表视图中,用户可以通过多个步骤编辑项目。最后,在编辑和查看更改后,用户返回列表。现在我希望列表使用用户之前设置的相同排序,搜索词和过滤器,并显示正确的结果。

在显示列表操作时,如何存储和重用多个参数(排序,搜索,过滤器)?

我想到的可能令人不满意的方式:

  • 传递所有需要的参数。如果两个列表操作调用之间涉及多个操作,则无法工作
  • 保存会话对象中的参数。这似乎需要大量代码来处理多个参数(检查参数是否传递给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
    }
    

3 个答案:

答案 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);
相关问题