将动态生成的表单传递给控制器

时间:2017-11-20 05:08:29

标签: javascript forms grails

这是我的JavaScript函数,用于在用户单击创建按钮时基于XML文件在运行时生成复选框:

function createform(){
       var xml = '<root><note ><to>x1</to><from><firstname>x2</firstname><lastname>x3</lastname></from><heading>x4</heading></note><note><to>x5</to><from><firstname>x6</firstname><lastname>x7</lastname></from><heading>x8</heading></note></root>';
       var node = (new DOMParser()).parseFromString(xml, "text/xml").documentElement;
       var nodes = node.querySelectorAll("*");
       for (var i = 0; i < nodes.length; i++) {
          var label = document.createElement('label');
          var br = document.createElement('br');

          var alabel = document.getElementById('div');
          var last = alabel[alabel.length - 1];
          label.htmlFor = "lbl"+i;
          label.appendChild(Createcheckbox(nodes[i].tagName));

          label.appendChild(document.createTextNode(nodes[i].tagName));
          label.appendChild(br);

          document.getElementById('div').appendChild(label);
       }
    }

    function Createcheckbox(chkboxid) {
       var checkbox = document.createElement('input');
       checkbox.type = "checkbox";
       checkbox.id = chkboxid;
       checkbox.value = chkboxid; 
       checkbox.checked = false;
       return checkbox;
    }

同样在我的gsp页面上,我有这个HTML脚本。

<body>
<g:form name="myForm" controller="dynamicform" action="index">
<input type="button" id="btncreate" value="Create" onclick="createform()"/>
<g:submitButton name="submit" value="Submit" />
<Div id='div'>
</div>
</g:form>
</body>

由于在用户点击“创建”按钮之前,此表单中的元素是未知的,因此我不确定处理此表单的最佳方法是什么。

我需要将元素的值传递给控制器​​以在视图中呈现它们(我稍后需要使用这些值来从我的数据库中检索一些数据)。

我尝试了在提交后查看这些元素的不同方法,例如:

for (name in params.list('name')) {
    println name
}

params.name.each{i->System.out.println(i);}

似乎我的参数没有传递给控制器​​。这是因为我使用常规HTML而不是Grails生成的表单元素形成<g: checkbox ... >,所以DOM元素不能传递给控制器​​吗?如果是,是否有办法使用Grails表单重写我的createform()函数?

我正在尝试学习Grails时遵循最佳实践,所以我很感激任何建议或建议。

1 个答案:

答案 0 :(得分:0)

这是一个简单的修复 -

function Createcheckbox(chkboxid) {
    var checkbox = document.createElement('input');
    checkbox.type = "checkbox";
    checkbox.id = chkboxid;
    checkbox.value = chkboxid;
    checkbox.checked = false;
    checkbox.name = chkboxid; // <-- the fix!!!
    return checkbox;
}

在控制器中:println params

  

[提交:提交,注意:注意:to:to,lastname:lastname,heading:heading,   controller:dynamicform,action:index]

enter image description here

评论:在HTML表单提交中,将提交具有name属性的任何输入。如果没有name attr,则不会将表单数据传递给服务器。

建议:将您的JS函数Createcheckbox(chkboxid)放在createform()之前