Grails - 在控制器和视图之间进行通信

时间:2011-06-07 21:19:23

标签: grails view groovy textbox controller

我想知道如何在我的视图中从控制器的列表中填充文本框,我一直在搜索示例,但是没有真正找到任何内容。我不确定如何从视图中准确地访问文本字段,在Java中你可以做一些像jTextField.getText()这样简单的事情。我也想知道如何在文本框中抓取文本。

下面我将发布一些我正在做的示例代码。

控制器:

def loadFile = {
    def propFile = "c:/props.txt"
    def propMap = [:]
    def propList = []

    new File(propFile).eachLine { line ->
    def (key,value) = line.split(':').collect { it.trim() }
    propMap."$key" = "$value"

    if(propMap) {
    propList << propMap
    propMap = [:]
    }
}

}

def saveFile = {
    //get contents of text box
    //over-write props.txt with new information
}

查看:

<g:textField name="properties"/>
<span class="menuButton"/><g:link action="loadFile" controller="myController">Load File</g:link>
<span class="menuButton"/><g:link action="saveFile" controller="myController">Save File</g:link> 

所以,我的问题看起来比较直接,当我想填充它并保存数据时如何访问文本框?

修改

在查看了你们提交的一些例子之后,我还有最后一个问题。

单击Load File按钮时,为什么以下代码有所不同?

<g:form controller="drive">
<g:textArea name="properties" value="${params.param1}" rows="50" cols="6"/>
<br/>
<g:submitButton name="loadFile" value="Load File"/>
<g:submitButton name="saveFile" value="Save File"/>
</g:form>
<span class="menuButton"/><g:link action="loadFile" controller="drive">Load File</g:link>

点击处理g:submitButton的{​​{1}}时,我会将我重定向到loadFile gsp。但是,当我单击list时,它会使用文件中的文本加载textArea。我问的原因是因为第二个选项,按钮不在我希望的位置。

2 个答案:

答案 0 :(得分:4)

在表单标记中包装文本字段。这样,当您提交它时,您可以访问控制器中的字段。

<g:form controller="myController" action="saveFile">
  <g:textField name="properties"/>
  <g:submitButton name="saveFile" value="Save File" />
</g:form>

然后,您可以访问控制器中的properties字段:

def saveFile = {
    def properties = params.properties
    // do whatever you need
}

编辑:

为了解决评论后面提出的一些问题,我将尝试提供更多见解。

假设您的控制器名为Drive,而视图(提交属性的表单)为drive/properties.gsp。如果希望您的加载按钮将属性加载到文本区域,您可以执行以下操作:

def loadFile = {
   // your code here

   render(view: 'properties.gsp', model=[properties:propList])
}

在你看来:

<g:form controller="drive">
  <g:textArea name="properties" value="${properties?.join("\n")}" rows="50" cols="6"/>
  <br/>
  <g:actionSubmit name="loadFile" action="loadFile" value="Load File"/>
  <g:actionSubmit name="saveFile" action="saveFile" value="Save File"/>
</g:form>

这应该使用您的文件中的值呈现您的表单,每个属性都在新行中。但我没有测试它。

答案 1 :(得分:4)

jjczopek's answer显示了从视图提交后如何访问控制器中的数据。

您可以通过在控制器中设置参数来将默认值从控制器传递到视图,例如......

    params.param1 ='value to pass'
    render(view:"testView")

然后在您的视图中,您可以使用...

再次检索它
<g:textField name="text1" value="${params.param1}"/>

您可能还会发现this questionthese docs有用。

如果想通过域对象,那么以下特定渲染方法之一可能会更好...... Grails Controller - Render