2011-01-21 7 views
7

Ho una pagina ASP.NET MVC 3. Su di esso, ho una tabella che trasformo in un jqGrid utilizzando i dati JSON da una chiamata Ajax. La griglia ha la seguente configurazione:jq Filtro Grid o ricerca per data non funzionante lato client

myGrid = $('#myGrid'); 
myGrid.jqGrid({ 
    caption: 'My Grid', 
    datatype: 'local', 
    data: data.rows, 
    height: 250, 
    pager: '#myPager', 
    viewrecords: true, 
    colModel: [ 
     ..., 
     { 
      label: 'blah', 
      name: 'blah', 
      align: 'left', 
      sortable: true, 
      editable: false, 
      width: 85, 
      formatter: 'date', 
      sorttype: 'date', 
      datefmt: 'm/d/Y', 
      formatoptions: { srcformat: 'm/d/Y', newformat: 'm/d/Y' } 
     }, 
     ... 
    ] 
}); 

// turn on filter toolbar 
myGrid.filterToolbar(); 

data.rows viene restituito dalla chiamata ajax. Funziona in tutti i modi tranne uno. Posso impaginare lato client, ordinare il lato client e cercare in ogni campo tranne quello che mostro colModel. Questo campo "blah" è un campo data e visualizza correttamente le date, in formato gg/mm/aaaa. Tuttavia, quando digito qualcosa come 11/17/2010 nella barra degli strumenti e premere invio, la ricerca restituisce 0 record.

Così ho scavato in profondità nel codice jqGrid, e qui è quello che genera prima che cerca:

{"groupOp":"AND","rules":[{"field":"blah","op":"bw","data":"11/17/2010"}]} 

Alla fine, quando si passa attraverso ogni riga e si valuta l'operazione sul campo, eval (m) & & p.push (questo) la linea, m è questa:

(String(this.blah).substr(0,10) == String("11/17/2010")) 

In pratica, mi sembra che non è riconoscendo che il campo è una data. Chiama analisi invece di parseDate. Qualcuno ha qualche idea su come risolvere questo problema? So che cercare lato server è facile, posso solo passare quella stringa, analizzarla e bam. Ma mi piacerebbe rimanere dalla parte dei clienti se posso. Sono stato in grado di duplicare questo in alcuni dei campioni che Oleg e Tom hanno messo, quindi è un problema o mi manca qualcosa nella configurazione ...

+0

Per il modo in cui jqGrid può effettuare chiamate AJAX, l'utilizzo di 'data.rows' non sarà necessario. Vedi alcuni link da http://stackoverflow.com/questions/2835957/jquery-with-asp-net-mvc-calling-ajax-enabled-web-service/2836817#2836817, http://stackoverflow.com/questions/ 4169384/how-can-i-bind-my-view-model-to-a-jqgrid/4169848 # 4169848 e http://www.trirand.com/blog/?page_id = 393/funzione-request/resto-support/# p21762. Posso continuare con i collegamenti ... – Oleg

+0

In realtà, ho dovuto completare la creazione della griglia all'interno della mia chiamata ajax. Il motivo è che devo chiamare GridUnload() perché sto aggiornando dinamicamente il mio filtro a discesa nella barra degli strumenti del filtro. Ho esaminato la documentazione e non sono riuscito a trovare qualcosa come trigger ('reloadToolbar'). – Milimetric

risposta

3

Trovo la tua domanda interessante così +1 da me a la tua domanda. Perché hai postato la linea

(String(this.blah).substr(0,10) == String("11/17/2010")) 

utilizzato in eval durante la ricerca locale suppongo si spende molto tempo per capire come la ricerca locale sono implementate. Perché si vede che la riga sopra (vedere (String(this.blah).substr(0,10) ...) non è cosa dovrebbe essere fatto (il valore di String(this.blah) sarà "2010-11-17" anziché "17/11/2010"), è possibile sovrascrivere la funzione corrispondente di jqGrid (la funzione _getStr all'interno di $.jgrid.from) e risolve il problema nel modo.

Qualche tempo fa dedico molto tempo a preparare il corrispondente the demo, che dimostra questa tecnica. La demo è stata preparata come the answer in trirand forum. Nella domanda si voleva trovare stringhe come 'bénevise' in caso di ricerca di 'benevise'. Quindi è necessario implementare una ricerca locale davvero personalizzata. Spero che le informazioni ti basteranno a risolvere il problema che descrivi.

AGGIORNATO: Mi sembra di aver trovato una soluzione molto più semplice. Dovresti semplicemente definire searchoptions: {sopt: ['eq','ne']} per la colonna 'blah' con i dati. Quindi "bw" (inizio con) non verrà utilizzato per la colonna. Le operazioni "uguale a" e "non uguale a" funzionano correttamente nella ricerca locale.

aggiornato 2: Here è l'esempio di lavoro in cui io uso sopt opzione.

+0

Ok, ho lavorato sull'esempio e funziona se cambio i miei dati di origine. Ho notato che i dati che stai utilizzando hanno date definite come "2007-09-01". I miei dati erano: new Date ("2007-09-01"). Il motivo è che i miei dati sorgente provengono da ASP.NET MVC e ho dovuto eseguire l'override di JSON.parse per interpretare correttamente il formato data di Microsoft:/^ \/Date \\ ((\ d +) \\) \/$/ Quindi non è un problema con la griglia, ma sarebbe bello poter passare in oggetti Date. Penso che l'unica modifica necessaria sia nella funzione parseDate, add: if (Object.prototype.toString.call (e) === '[object Date]') {return e; } Grazie Oleg! – Milimetric

Problemi correlati