我有一个用户控制器,主要是CRUD,弹簧工具套件可以自动生成基本的功能视图。
package rms
import org.springframework.dao.DataIntegrityViolationException
class UserController {
static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
def index() {
redirect(action: "list", params: params)
}
def list(Integer max) {
params.max = Math.min(max ?: 10, 100)
[userInstanceList: User.list(params), userInstanceTotal: User.count()]
}
def create() {
[userInstance: new User(params)]
}
def save() {
def userInstance = new User(params)
if (!userInstance.save(flush: true)) {
render(view: "create", model: [userInstance: userInstance])
return
}
flash.message = message(code: 'default.created.message', args: [message(code: 'user.label', default: 'User'), userInstance.id])
redirect(action: "show", id: userInstance.id)
}
def show(Long id) {
def userInstance = User.get(id)
if (!userInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'user.label', default: 'User'), id])
redirect(action: "list")
return
}
[userInstance: userInstance]
}
def edit(Long id) {
def userInstance = User.get(id)
if (!userInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'user.label', default: 'User'), id])
redirect(action: "list")
return
}
[userInstance: userInstance]
}
def update(Long id, Long version) {
def userInstance = User.get(id)
if (!userInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'user.label', default: 'User'), id])
redirect(action: "list")
return
}
if (version != null) {
if (userInstance.version > version) {
userInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
[message(code: 'user.label', default: 'User')] as Object[],
"Another user has updated this User while you were editing")
render(view: "edit", model: [userInstance: userInstance])
return
}
}
userInstance.properties = params
if (!userInstance.save(flush: true)) {
render(view: "edit", model: [userInstance: userInstance])
return
}
flash.message = message(code: 'default.updated.message', args: [message(code: 'user.label', default: 'User'), userInstance.id])
redirect(action: "show", id: userInstance.id)
}
def delete(Long id) {
def userInstance = User.get(id)
if (!userInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'user.label', default: 'User'), id])
redirect(action: "list")
return
}
try {
userInstance.delete(flush: true)
flash.message = message(code: 'default.deleted.message', args: [message(code: 'user.label', default: 'User'), id])
redirect(action: "list")
}
catch (DataIntegrityViolationException e) {
flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'user.label', default: 'User'), id])
redirect(action: "show", id: id)
}
}
}
然后我尝试在不同的gsp中使用它的方法我创建的不在视图/用户下。我从自动生成的视图/用户/列表中复制了表格html和paginate html代码。我自己认为其余的只是静态的html页眉和页脚,所以它不应该是重要的。
<table>
<thead>
<tr>
<g:sortableColumn property="username" title="${message(code: 'user.username.label', default: 'Username')}" />
<g:sortableColumn property="password" title="${message(code: 'user.password.label', default: 'Password')}" />
<g:sortableColumn property="dateOfBirth" title="${message(code: 'user.dateOfBirth.label', default: 'Date Of Birth')}" />
<g:sortableColumn property="contactNumber" title="${message(code: 'user.contactNumber.label', default: 'Contact Number')}" />
<g:sortableColumn property="employeeID" title="${message(code: 'user.employeeID.label', default: 'Employee ID')}" />
<g:sortableColumn property="employeeStatus" title="${message(code: 'user.employeeStatus.label', default: 'Employee Status')}" />
</tr>
</thead>
<tbody>
<g:each in="${userInstanceList}" status="i" var="userInstance">
<tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
<td><g:link action="show" id="${userInstance.id}">${fieldValue(bean: userInstance, field: "username")}</g:link></td>
<td>${fieldValue(bean: userInstance, field: "password")}</td>
<td><g:formatDate date="${userInstance.dateOfBirth}" /></td>
<td>${fieldValue(bean: userInstance, field: "contactNumber")}</td>
<td>${fieldValue(bean: userInstance, field: "employeeID")}</td>
<td>${fieldValue(bean: userInstance, field: "employeeStatus")}</td>
</tr>
</g:each>
</tbody>
</table>
<div class="pagination">
<g:paginate total="${userInstanceTotal}" />
</div>
每当我在自己的视图下使用可排序列时,它会被重定向到view / user / list,然后paginate无法找到totalInstanceTotal的总值。在我自己的视图下也没有数据,但在我使用view / user / create
创建数据后,创建的数据正在处理自动生成的CRUD视图/用户/列表答案 0 :(得分:0)
Grails默认使用当前控制器的操作。
您可以使用controller
和action
属性覆盖大多数代码的此行为。例如,<g:paginate />
支持以下属性:
<g:paginate controller="user" action="list" total="${userInstanceTotal}" />
在这种情况下,将调用UserController.list()
来接收下一页/上一页。
不幸的是,<g:sortableColumn />
标记似乎没有这些属性。但是,它支持mapping
属性,可用于引用named url mapping。
static mappings = {
name userList: "/userList" {
controller = 'user'
action = 'list'
}
<g:sortableColumn mapping="userList" .. />
答案 1 :(得分:0)
在传统的请求/响应应用程序中,如果要对两个不同的GSP使用相同的控制器操作(例如list()
),则需要在控制器操作中添加条件以确定要呈现的页面,例如request.getHeader('referer')
或通过传递额外的参数来确定您所在的页面。但是,我建议不要这样做,因为它违反了单一责任原则。相反,我会选择创建另一个控制器方法,例如
myList(Integer max){
params.max = Math.min(max ?: 10, 100)
return [userInstanceList: User.list(params), userInstanceTotal: User.count()]
}
这不是很干,但如果您的要求变得更复杂,您可以将公共部分移动到服务中。
将list.gsp
复制到myList.gsp
。 Everthing与分页标记相同,更改分页标记以包含action
<g:paginate action='myList' total="${userInstanceTotal}" />
请注意添加action='myList'
。如果您不提供此功能,则默认为list()