2014-03-04 103 views
0

我需要在grails中创建一个动态表单,它在运行时有各种动态创建的输入框,然后将其参数提交给控制器,就像在编译时创建的表单一样。有任何想法吗?grails:如何动态构建表单?

视图GSP可能是这样的:

<g:form controller="report" action="view">   
    <input type="submit" value="Submit"> 
    <!-- insert some inuput params here at runtime --> 
</g:form> 

和动作控制器将是:

class ReportController { 
def view = { 
    def someDynamicParam = "someParam" 
    if (params["someParam"] != null) { 
     ... 
    } 

问题是我不知道如何来渲染表单输入字段的方式Grails会在提交时理解它们。

+1

运行'grails install-templates'并查看用于生成脚手架视图的脚本。那里可能会有一两个暗示。 – zoran119

+0

你想在哪里创建输入字段 - 在客户端浏览器还是在服务器端?因此请分别查看zoran119的评论或Sérgio的回答 – aldrin

回答

1

我会做类似

<g:form controller="report" action="view">   
    <input type="submit" value="Submit"> 
    <g:if test="${checkIfParamsExists}"> 
    <input type="text" id="newParamName"/> 
    </g:if> 
</g:form> 

并在控制器端,你的代码应该工作正常。

+0

我明白了,非常感谢。作为第二个问题,我认为我还需要添加JavaScript来进行任何客户端验证,例如检查他们没有键入一个数字类型的输入字符。如果我在服务器端进行了这项检查,它太晚了,因为我无法显示输入表单的哪一部分出现错误,因为它已被提交,并且我将在新页面上结束。 –

+0

生成表单grails也会根据所使用的域生成所有客户端验证。因此,在生成表单之后,只需复制所需参数的一部分,然后将其粘贴到g:if部分中。表格部分看起来像这样(您需要为每个参数复制此部分)

\t \t

1

要创建动态输入,您需要JavaScript。我建议你使用一些框架来使它更容易。以JQuery为例:

$('<input>').attr({ 
    type: 'text', 
    id: 'foo', 
    name: 'foo' 
}).appendTo('form'); 

然后你需要考虑如何将它绑定到一个Domain Class。看着你的问题我不能看你需要什么,但让我们做一个例子,其中用户可设定值:

//domain class 
class MyDomainClass { 
    String value 
} 

//javascript to add a new value 
$('<input>').attr({ 
    type: 'text', 
    name: 'values' 
}).appendTo('form'); 

//controller submit action 
class MyController { 
    def save() { 
    def values = params.list('values') //get the list of values 
    values.each { 
     MyDomain instance = new MyDomain(value: it) 
     instance.save() 
    } 
    } 
} 

这里的关键是使用你的HTML一样name,并使用params.list()改造列表中的子值。

+0

您不需要* javascript。这只是一种方法。他可以写一个标签库来提供帮助。或者只是在GSP上有一些迭代和条件逻辑。 JavaScript可能是我动态表单的最后一招。 – Gregg

+0

对,我认为OP想要一个按钮“添加更多”来创建新的输入。如果只是为了检查是否需要显示某些输入,我同意你的看法。 –