如何在grails中创建动态按钮
我正试图用这种逻辑创建一些应用程序 我有关于汽车的条目,我想在我的汽车列表中的每个条目中添加“租赁”按钮,当我点击按钮时,按钮将打开一些表格获取条目联系信息,该表格应自动获取汽车id号 这是我的汽车领域类。我不知道如何将该按钮添加到我的index.gsp,其中列出了我关于汽车的条目,以及如何从列表中获取所选汽车的id号并发送到表单 如何做到这一点?这种逻辑是如何运作的如何在grails中创建动态按钮,grails,Grails,我正试图用这种逻辑创建一些应用程序 我有关于汽车的条目,我想在我的汽车列表中的每个条目中添加“租赁”按钮,当我点击按钮时,按钮将打开一些表格获取条目联系信息,该表格应自动获取汽车id号 这是我的汽车领域类。我不知道如何将该按钮添加到我的index.gsp,其中列出了我关于汽车的条目,以及如何从列表中获取所选汽车的id号并发送到表单 如何做到这一点?这种逻辑是如何运作的 package rentme class Car { String brand String model
package rentme
class Car {
String brand
String model
String fuelType
BigDecimal pricePerDay
String busy
static constraints = {
brand(inList:["AUDI", "BMW", "MERCEDES", "NISSAN", "HONDA", "FORD"])
fuelType(inList:["FUEL", "DIESEL", "AUTOGAS"])
pricePerDay(min:0.0, max:1000.0)
busy(inList:["YES", "NO"])
}
}
这就是我所尝试的
这是视图文件中的my Car/index.gsp。
-在这里,我得到了汽车id,并试图把每个id的按钮。我想这样做;按钮将转到另一个页面,该页面将是租车登记页面,在该登记页面中,用户将看到所选车辆的id号
<g:each in="${carList}" var="car">
<p>${car.id} </p>
<g:link action="registration" controller="registration" params="[carId : ${car.id} ]">
Rent Car
</g:link>
</g:each>
这是我的注册控制器,我用generateall命令创建了它
package rentme
import static org.springframework.http.HttpStatus.*
import grails.transaction.Transactional
@Transactional(readOnly = true)
class RegistrationController {
static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]
def index(Integer max) {
params.max = Math.min(max ?: 10, 100)
respond Registration.list(params), model:[registrationCount: Registration.count()]
}
def show(Registration registration) {
respond registration
println params
Car b = Car.get(params.id)
}
def create() {
respond new Registration(params)
}
@Transactional
def save(Registration registration) {
if (registration == null) {
transactionStatus.setRollbackOnly()
notFound()
return
}
if (registration.hasErrors()) {
transactionStatus.setRollbackOnly()
respond registration.errors, view:'create'
return
}
registration.save flush:true
request.withFormat {
form multipartForm {
flash.message = message(code: 'default.created.message', args: [message(code: 'registration.label', default: 'Registration'), registration.id])
redirect registration
}
'*' { respond registration, [status: CREATED] }
}
}
def edit(Registration registration) {
respond registration
}
@Transactional
def update(Registration registration) {
if (registration == null) {
transactionStatus.setRollbackOnly()
notFound()
return
}
if (registration.hasErrors()) {
transactionStatus.setRollbackOnly()
respond registration.errors, view:'edit'
return
}
registration.save flush:true
request.withFormat {
form multipartForm {
flash.message = message(code: 'default.updated.message', args: [message(code: 'registration.label', default: 'Registration'), registration.id])
redirect registration
}
'*'{ respond registration, [status: OK] }
}
}
@Transactional
def delete(Registration registration) {
if (registration == null) {
transactionStatus.setRollbackOnly()
notFound()
return
}
registration.delete flush:true
request.withFormat {
form multipartForm {
flash.message = message(code: 'default.deleted.message', args: [message(code: 'registration.label', default: 'Registration'), registration.id])
redirect action:"index", method:"GET"
}
'*'{ render status: NO_CONTENT }
}
}
protected void notFound() {
request.withFormat {
form multipartForm {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'registration.label', default: 'Registration'), params.id])
redirect action: "index", method: "GET"
}
'*'{ render status: NOT_FOUND }
}
}
}
我在def show方法中为get car.id添加了这行代码
def show(Registration registration) {
respond registration
println params
Car b = Car.get(params.id)
}
<div><p>${car.id} </p></div>
Error 500: Internal Server Error
URI
/car/index
Class
org.grails.taglib.GrailsTagException
Message
Request processing failed; nested exception is java.lang.RuntimeException: Error initializing GroovyPageView
Caused by
[views/car/index.gsp:32] Attribute value quote wasn't closed (action="registration" controller="registration" params="[carId : ${car.id} ]").
I don't know this method is good or not but i get this error when i open on browser my registration index page
Line | Method
->> 223 | createGroovyPageView in org.grails.web.servlet.view.GroovyPageViewResolver
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 200 | createGrailsView in ''
| 99 | loadView . . . . . . in ''
| 36 | loadView in grails.plugin.scaffolding.ScaffoldingViewResolver
| 244 | createView . . . . . in org.springframework.web.servlet.view.AbstractCachingViewResolver
| 472 | createView in org.springframework.web.servlet.view.UrlBasedViewResolver
| 146 | resolveViewName . . . in org.springframework.web.servlet.view.AbstractCachingViewResolver
| 88 | resolveViewName in org.grails.web.servlet.view.GroovyPageViewResolver
| 57 | resolveViewName . . . in org.grails.web.servlet.view.GrailsLayoutViewResolver
| 1296 | resolveViewName in org.springframework.web.servlet.DispatcherServlet
| 1234 | render . . . . . . . in ''
| 1037 | processDispatchResult in ''
| 980 | doDispatch . . . . . in ''
| 897 | doService in ''
| 970 | processRequest . . . in org.springframework.web.servlet.FrameworkServlet
| 861 | doGet in ''
| 622 | service . . . . . . . in javax.servlet.http.HttpServlet
| 846 | service in org.springframework.web.servlet.FrameworkServlet
| 729 | service . . . . . . . in javax.servlet.http.HttpServlet
| 230 | internalDoFilter in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter . . . . . . in ''
| 52 | doFilter in org.apache.tomcat.websocket.server.WsFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 55 | doFilterInternal . . in org.springframework.boot.web.filter.ApplicationContextHeaderFilter
| 107 | doFilter in org.springframework.web.filter.OncePerRequestFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 105 | doFilterInternal . . in org.springframework.boot.actuate.trace.WebRequestTraceFilter
| 107 | doFilter in org.springframework.web.filter.OncePerRequestFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 77 | doFilterInternal . . in org.grails.web.servlet.mvc.GrailsWebRequestFilter
| 107 | doFilter in org.springframework.web.filter.OncePerRequestFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 67 | doFilterInternal . . in org.grails.web.filters.HiddenHttpMethodFilter
| 107 | doFilter in org.springframework.web.filter.OncePerRequestFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 197 | doFilterInternal . . in org.springframework.web.filter.CharacterEncodingFilter
| 107 | doFilter in org.springframework.web.filter.OncePerRequestFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 96 | doFilterInternal . . in org.springframework.web.filter.CorsFilter
| 107 | doFilter in org.springframework.web.filter.OncePerRequestFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 107 | doFilterInternal . . in org.springframework.boot.actuate.autoconfigure.MetricsFilter
| 192 | internalDoFilter in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter . . . . . . in ''
| 198 | invoke in org.apache.catalina.core.StandardWrapperValve
| 108 | invoke . . . . . . . in org.apache.catalina.core.StandardContextValve
| 472 | invoke in org.apache.catalina.authenticator.AuthenticatorBase
| 140 | invoke . . . . . . . in org.apache.catalina.core.StandardHostValve
| 79 | invoke in org.apache.catalina.valves.ErrorReportValve
| 87 | invoke . . . . . . . in org.apache.catalina.core.StandardEngineValve
| 349 | service in org.apache.catalina.connector.CoyoteAdapter
| 784 | service . . . . . . . in org.apache.coyote.http11.Http11Processor
| 66 | process in org.apache.coyote.AbstractProcessorLight
| 802 | process . . . . . . . in org.apache.coyote.AbstractProtocol$ConnectionHandler
| 1410 | doRun in org.apache.tomcat.util.net.NioEndpoint$SocketProcessor
| 49 | run . . . . . . . . . in org.apache.tomcat.util.net.SocketProcessorBase
| 1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 617 | run . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
| 61 | run in org.apache.tomcat.util.threads.TaskThread$WrappingRunnable
^ 745 | run . . . . . . . . . in java.lang.Thread
Caused by GrailsTagException: [views/car/index.gsp:32] Attribute value quote wasn't closed (action="registration" controller="registration" params="[carId : ${car.id} ]").
->> 32 | populateMapWithAttributes in views/car/index.gsp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
这是我在viewsregistration/index.gsp中的注册页面
<!DOCTYPE html>
<html>
<head>
<meta name="layout" content="main" />
<g:set var="entityName" value="${message(code: 'registration.label', default: 'Registration')}" />
<title><g:message code="default.list.label" args="[entityName]" /></title>
</head>
<body>
<a href="#list-registration" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a>
<div class="nav" role="navigation">
<ul>
<li><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></li>
<li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li>
</ul>
</div>
<div id="list-registration" class="content scaffold-list" role="main">
<h1><g:message code="default.list.label" args="[entityName]" /></h1>
<g:if test="${flash.message}">
<div class="message" role="status">${flash.message}</div>
</g:if>
<f:table collection="${registrationList}" />
<div class="pagination">
<g:paginate total="${registrationCount ?: 0}" />
</div>
<div><p>${car.id} </p></div>
</div>
</body>
</html>
我在这里为get car.id添加了代码
def show(Registration registration) {
respond registration
println params
Car b = Car.get(params.id)
}
<div><p>${car.id} </p></div>
Error 500: Internal Server Error
URI
/car/index
Class
org.grails.taglib.GrailsTagException
Message
Request processing failed; nested exception is java.lang.RuntimeException: Error initializing GroovyPageView
Caused by
[views/car/index.gsp:32] Attribute value quote wasn't closed (action="registration" controller="registration" params="[carId : ${car.id} ]").
I don't know this method is good or not but i get this error when i open on browser my registration index page
Line | Method
->> 223 | createGroovyPageView in org.grails.web.servlet.view.GroovyPageViewResolver
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 200 | createGrailsView in ''
| 99 | loadView . . . . . . in ''
| 36 | loadView in grails.plugin.scaffolding.ScaffoldingViewResolver
| 244 | createView . . . . . in org.springframework.web.servlet.view.AbstractCachingViewResolver
| 472 | createView in org.springframework.web.servlet.view.UrlBasedViewResolver
| 146 | resolveViewName . . . in org.springframework.web.servlet.view.AbstractCachingViewResolver
| 88 | resolveViewName in org.grails.web.servlet.view.GroovyPageViewResolver
| 57 | resolveViewName . . . in org.grails.web.servlet.view.GrailsLayoutViewResolver
| 1296 | resolveViewName in org.springframework.web.servlet.DispatcherServlet
| 1234 | render . . . . . . . in ''
| 1037 | processDispatchResult in ''
| 980 | doDispatch . . . . . in ''
| 897 | doService in ''
| 970 | processRequest . . . in org.springframework.web.servlet.FrameworkServlet
| 861 | doGet in ''
| 622 | service . . . . . . . in javax.servlet.http.HttpServlet
| 846 | service in org.springframework.web.servlet.FrameworkServlet
| 729 | service . . . . . . . in javax.servlet.http.HttpServlet
| 230 | internalDoFilter in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter . . . . . . in ''
| 52 | doFilter in org.apache.tomcat.websocket.server.WsFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 55 | doFilterInternal . . in org.springframework.boot.web.filter.ApplicationContextHeaderFilter
| 107 | doFilter in org.springframework.web.filter.OncePerRequestFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 105 | doFilterInternal . . in org.springframework.boot.actuate.trace.WebRequestTraceFilter
| 107 | doFilter in org.springframework.web.filter.OncePerRequestFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 77 | doFilterInternal . . in org.grails.web.servlet.mvc.GrailsWebRequestFilter
| 107 | doFilter in org.springframework.web.filter.OncePerRequestFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 67 | doFilterInternal . . in org.grails.web.filters.HiddenHttpMethodFilter
| 107 | doFilter in org.springframework.web.filter.OncePerRequestFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 197 | doFilterInternal . . in org.springframework.web.filter.CharacterEncodingFilter
| 107 | doFilter in org.springframework.web.filter.OncePerRequestFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 96 | doFilterInternal . . in org.springframework.web.filter.CorsFilter
| 107 | doFilter in org.springframework.web.filter.OncePerRequestFilter
| 192 | internalDoFilter . . in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter in ''
| 107 | doFilterInternal . . in org.springframework.boot.actuate.autoconfigure.MetricsFilter
| 192 | internalDoFilter in org.apache.catalina.core.ApplicationFilterChain
| 165 | doFilter . . . . . . in ''
| 198 | invoke in org.apache.catalina.core.StandardWrapperValve
| 108 | invoke . . . . . . . in org.apache.catalina.core.StandardContextValve
| 472 | invoke in org.apache.catalina.authenticator.AuthenticatorBase
| 140 | invoke . . . . . . . in org.apache.catalina.core.StandardHostValve
| 79 | invoke in org.apache.catalina.valves.ErrorReportValve
| 87 | invoke . . . . . . . in org.apache.catalina.core.StandardEngineValve
| 349 | service in org.apache.catalina.connector.CoyoteAdapter
| 784 | service . . . . . . . in org.apache.coyote.http11.Http11Processor
| 66 | process in org.apache.coyote.AbstractProcessorLight
| 802 | process . . . . . . . in org.apache.coyote.AbstractProtocol$ConnectionHandler
| 1410 | doRun in org.apache.tomcat.util.net.NioEndpoint$SocketProcessor
| 49 | run . . . . . . . . . in org.apache.tomcat.util.net.SocketProcessorBase
| 1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 617 | run . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
| 61 | run in org.apache.tomcat.util.threads.TaskThread$WrappingRunnable
^ 745 | run . . . . . . . . . in java.lang.Thread
Caused by GrailsTagException: [views/car/index.gsp:32] Attribute value quote wasn't closed (action="registration" controller="registration" params="[carId : ${car.id} ]").
->> 32 | populateMapWithAttributes in views/car/index.gsp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
默认情况下,将id分配给域类。因此,在index.gsp中,您可以简单地遍历汽车列表,并为每辆汽车创建一个租金按钮。你可以用g:来表示如下所示
<g:each var="car" in="${cars}"> // cars is a list of cars
<p>Brand: ${car.brand}</p>
<p>Model: ${car.model}</p>
<p><button name="rentCar${car.id}" onclick="rentCar(this, ${car.id})">Rent Car</button</p>
</g:each>
在show action中注释这些行,如下所示
def show(Registration registration) {
respond registration
// println params
// Car b = Car.get(params.id)
}
2汽车/指数.gsp
3注册/索引.gsp
谢谢你,再给我一分钟,我也想要这个;当用户点击按钮将打开一些页面,其中将形成类似订单的形式,我不想在这个页面汽车品牌和车型将自动哪些用户选择。怎么做?@user3348410我编辑了我以前的答案。看一看。非常感谢你,如果我将在我的订单视图中创建带有表单的订单域类和控制器,我会自动获取内容吗?或者我应该向订单控制器添加一些额外的参数?当我在我的cars/index.gsp消息请求处理失败中添加您的代码时,我会出现此错误;嵌套异常为java.lang.RuntimeException:初始化GroovyPageView时出错,原因是[views/car/index.gsp:31]属性值引号未关闭操作=租金控制器=订单参数=[car:${car},carId:${car.id}]。问题在于上面的g:链接不正确
def show(Registration registration) {
respond registration
// println params
// Car b = Car.get(params.id)
}
<g:link action="index" controller="registration" params="[carId : ${car.id} ]">
Rent Car
</g:link>
<div><p>Car ID : ${car.id} </p></div>