Если у меня есть страница, которая генерирует результаты поиска на основе некоторых компонентов ajax и вызова метода контроллера, каков наилучший способ сохранить состояние этой страницы (с результатами поиска), чтобы я мог вернуться в любое указать в сессии, чтобы снова увидеть эту страницу?
1) Поиск, получение результатов
2) Внесите некоторые изменения на другой странице
3) Вернитесь к результатам поиска, см. Ту же страницу, что и 1, оставленную с.
Я читал о веб-потоках (которые кажутся ненужными и более формальными, чем то, что мне нужно) и состояниях сохранения AJAX, но также кажется неправильным. Также увидел, что Grails не выходит из коробки с этой функциональностью (что кажется странным для веб-фреймворка).
Edit:
Как мне сохранить этот список searchResults, который заполняется вызовом из моего контроллера, для этого сеанса? Я думаю, что мне просто не хватает этого моста между моей логикой и сохранением сессии.
class SearchService {
boolean transaction = false
static scope = 'session'
def searchResults
private Contact[] updateContactSearchList(String ns, Company c, String si, String res) {
def nameSearch = ns
def company = Company.get(c?.id)
def showInactives = si
def reset = res
if(res == "true") {
render(template:'searchResults', model: [searchResults:"", total: 0])
return
}
if(showInactives == "on" && nameSearch == "" && company != null) {
searchResults = Contact.withCriteria {
eq('company', company)
and {
eq('isActive', false)
}
}
searchResults.sort{it.lastName}
return searchResults
}
else if(showInactives == "on" && nameSearch == "" && company == null) {
searchResults = Contact.withCriteria {
eq('isActive', false)
}
searchResults.sort{it.lastName}
return searchResults
}
else if(showInactives == "on" && nameSearch != "" && company != null) {
searchResults = Contact.withCriteria {
eq('company', company)
and {
eq('isActive', false)
}
or {
ilike('firstName', '%' + nameSearch + '%')
ilike('lastName', '%' + nameSearch + '%')
ilike('fullName', '%' + nameSearch + '%')
}
}
searchResults.sort{it.lastName}
return searchResults
}
else if(showInactives == "on" && nameSearch != "" && company == null) {
searchResults = Contact.withCriteria {
eq('isActive', false)
or {
ilike('firstName', '%' + nameSearch + '%')
ilike('lastName', '%' + nameSearch + '%')
ilike('fullName', '%' + nameSearch + '%')
}
}
searchResults.sort{it.lastName}
return searchResults
}
else if(showInactives == null && nameSearch == "" && company != null) {
searchResults = Contact.withCriteria {
eq('isActive', true)
and {
eq('company', company)
}
}
searchResults.sort{it.lastName}
return searchResults
}
else if(showInactives == null && nameSearch == "" && company == null) {
searchResults = Contact.withCriteria {
eq('isActive', true)
}
searchResults.sort{it.lastName}
return searchResults
}
else if(showInactives == null && nameSearch != "" && company != null) {
searchResults = Contact.withCriteria {
eq('isActive', true)
and {
eq('company', company)
}
or {
ilike('firstName', '%' + nameSearch + '%')
ilike('lastName', '%' + nameSearch + '%')
ilike('fullName', '%' + nameSearch + '%')
}
}
searchResults.sort{it.lastName}
return searchResults
}
else if(showInactives == null && nameSearch != "" && company == null) {
searchResults = Contact.withCriteria {
eq('isActive', true)
or {
ilike('firstName', '%' + nameSearch + '%')
ilike('lastName', '%' + nameSearch + '%')
ilike('fullName', '%' + nameSearch + '%')
}
}
searchResults.sort{it.lastName}
return searchResults
}
else {
//log error
}
}
}