【问题标题】:How to store parameters for action to be used again later如何存储参数以供以后再次使用
【发布时间】:2016-10-20 08:41:37
【问题描述】:

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

显示列表动作时如何存储和重复使用多个参数(排序、搜索、过滤)?

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

  • 传递所有需要的参数。如果两个列表操作调用之间涉及多个操作,则几乎不起作用
  • 将参数保存在会话对象中。这似乎需要很多代码来处理多个参数(检查参数是否传递给动作,存储新值,如果参数没有传递,从会话中获取旧参数,处理空字符串参数):

    Long longParameter
    if(params.containsKey('longParameter')) {
        longParameter = params.getLong('longParameter')
        session.setAttribute('longParameter', longParameter)
    } else {
        longParameter = session.getAttribute('longParameter') as Long
        params['longParameter'] = longParameter
    }
    

【问题讨论】:

    标签: session grails request parameter-passing


    【解决方案1】:

    如果你想让它更通用,你可以改用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。

    【讨论】:

    • 我已经运行了代码,它似乎可以工作,但我没有测试用例来证明它:-)
    • 如果你使用的是 Grails
    【解决方案2】:

    我也使用会话。下面是一个示例,您可以根据自己的需要进行调整:

    def list() {
      if (request.method == 'GET' && !request.queryString) {
        if (session[controllerName]) {
          // Recall params from memory
          params.putAll(session[controllerName])
        }
      } else {
        // Save params to memory and redirect to get clean URL
        session[controllerName] = extractParams(params)
        redirect(action: actionName)
        return
      }
    
      // Do your actions here...
    }
    
    def extractParams(params) {
      def ret = [:]
      params.each { entry ->
        if (entry.key.startsWith("filter_") || entry.key == "max" || entry.key == "offset" || entry.key == "sort" || entry.key == "order") {
          ret[entry.key] = entry.value
        }
      }
      return ret
    }
    

    【讨论】:

      【解决方案3】:

      使用session 是您最好的选择。只需在首选时保存首选项。我的意思是,当用户排序或过滤时,只需将该信息保存在session 中,对于特定的&lt;controller&gt;.&lt;action&gt;,然后返回页面。下一次,检查session,如果它有任何与&lt;controller&gt;.&lt;action&gt;相关的东西,应用那些;否则呈现默认页面。

      您可能想为此使用一些Interceptor,正如sbglasius, here 所建议的那样。

      我希望你明白我的意思。

      【讨论】:

      • 我编辑了我的问题以添加一个代码示例。这看起来像一个参数的很多代码,我经常有很多哦他们
      猜你喜欢
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      相关资源
      最近更新 更多