通过下拉视图过滤控制器中的数据

时间:2014-07-09 14:13:58

标签: ajax grails groovy filter

我有一个大型数据集,我试图在控制器本身进行过滤,并仅将相关数据发送到视图(index.gsp;客户端)

视图1:

<form>
   <g:select from="['AFFILIATES', 'SEO', 'SEM','DISPLAYADS']" name="mv"
      onchange="${remoteFunction(
      controller:'Pgtyp', 
      action:'ajaxGetMv', 
      params:'\'mv=\' + (this.value)',
      onSuccess: 'printpgtyp(data)')}">
   </g:select>
</form>

控制器1:

def ajaxGetMv = {
   def pgtyp = Pgtyp.executeQuery("select p.visits,p.mv from Pgtyp p where p.mv = ?",[params.mv])
   //console.log(params.id)
   render pgtyp as JSON
}

现在,这部分在控制台上打印后效果很好,它可以过滤特定&#34; mv&#34;的数据。 但是,我有多个相互独立的下拉(5),我希望所有这5个值始终传递给我的控制器,然后相应地过滤数据以进入视图,但我无法实现这一点。

我使用&#34; html实现了它 - document.getElement&#34;但数据太重,无法在客户端处理(浏览器崩溃) 因此,我需要在groovy控制器端进行过滤。 我通过2次下拉尝试了2个过滤器:

视图2:

<form>
   <g:select from="['AFFILIATES', 'SEO', 'SEM','DISPLAYADS']" name="mv"
      onchange="${remoteFunction(
      controller:'Pgtyp', 
      action:'ajaxGetMv', 
      params:'\'mv=\' + (this.value)',
      onSuccess: 'printpgtyp(data)')}">
   </g:select>
</form>

<form>
   <g:select from="['INTERNET EXPLORER', 'MOZILLA', 'GOOGLE CHROME','MOZILLA' ,'OTHERS','SAFARI']" 
     name="browser"
     onchange="${remoteFunction(
     controller:'Pgtyp', 
     action:'ajaxGetMv', 
     params:'\'browser=\' + (this.value)',
     onSuccess: 'printpgtyp(data)')}">
   </g:select>
</form>

控制器2:

class PgtypController {
   def ajaxGetMv = {
     def pgtyp = Pgtyp.executeQuery("select p.visits, p.mv, p.browser from Pgtyp p where p.mv = ? and p.browser = ?",[params.mv & params.browser])
     render pgtyp as JSON
   }

   def index() { }
} 

错误:

POST http://localhost:8082/marchmock2/pgtyp/ajaxGetMv 500 (Internal Server Error) 
send 
x.extend.ajax 
onchange

任何建议将不胜感激。 另外,如果这在grails中不可行,请告诉我,但我认为它主要应该是。

1 个答案:

答案 0 :(得分:2)

更改

[params.mv & params.browser]

[params.mv, params.browser]

在您的hql查询(Controller2)中。


是的,您正在获取过滤数据。列表清单(包含p.visits,p.mv,p.browser)。您可以获得像

这样的p.visits
jQuery.ajax({
    url: '${createLink(controller: 'myController', action: 'myAction')}',
    success: function(data){
        for (var idx = 0; idx <= data.length - 1; idx++) {
            console.info(data[idx][0])    
        }
    }
});