grails:如何动态构建表单?

时间:2014-03-04 22:06:06

标签: forms 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在提交时理解它们的方式呈现表单输入字段。

2 个答案:

答案 0 :(得分:1)

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

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

然后你需要考虑如何将它绑定到域类。看看你的问题我看不到你需要什么,但让我们举一个用户可以设置值的例子:

//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()转换列表中的提交值。

答案 1 :(得分: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>

在控制器方面,您的代码应该可以正常工作。