Grails - 控制器和视图之间的通信

3
我想知道如何从我的控制器中的列表填充视图中的文本框,我已经搜索了一段时间的示例,但并没有真正找到什么有用的东西。我不确定如何准确地从视图中访问文本字段,而在Java中,您可以轻松地执行像这样的操作。我还想知道如何获取我的文本框中的文本。
下面我将发布一些示例代码。
控制器:
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> 

所以,我的问题似乎相对简单,当我要填充文本框并保存其中的数据时,如何访问文本框?

.

.

.

编辑

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

为什么当单击“加载文件”按钮时,以下代码会表现出不同的行为?

<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>

当单击处理loadFile的g:submitButton时,它会将我重定向到list gsp。但是,当我单击menuButton时,它会将文本区域加载文件中的文本。我提出这个问题的原因是第二个选项中,按钮不在我想要它在的位置。

3
在您的控制器中,当表单提交时,使用“println params?.properties”来查看字段所提交的值。 - virtualeyes
@virtualeyes,抱歉我在应用程序的Web端相对较新,但我不知道您想让我在哪里添加打印语句。 - StartingGroovy
2
@SG,在def saveFile {}中,但这假设属性文本字段在loadFile()后实际上被填充了数据。我知道Groovy比Grails更好 - 请耐心等待,对于全职Grails用户来说,这是非常容易的事情。 - virtualeyes
et voila,Grails用户@jjczopek来解救了。 - virtualeyes
2个回答

4
将您的文本字段放在form标签中。这样,当您提交它时,您可以在控制器中访问您的字段。
<g:form controller="myController" action="saveFile">
  <g:textField name="properties"/>
  <g:submitButton name="saveFile" value="Save File" />
</g:form>

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

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>

这应该可以使用来自您的文件的值渲染您的表单,每个属性在新行中。但我没有测试它。


现在这个方法可以很好地保存textArea的内容,但我在从文件中加载它时遇到了问题。 - StartingGroovy
谢谢你的示例!我已经编辑了主要问题并添加了一个问题,请查看一下如果你有机会。 - StartingGroovy
感谢您的代码,我认为问题与 actionSubmit 有关,两个按钮似乎都无法找到该操作,即使我像您一样添加了 action 属性。按下按钮时生成的链接如下所示:drive/list?loadFiledrive/list?saveFile。我不确定为什么它要查找 list,对于可能正在发生的事情有什么想法吗? - StartingGroovy
似乎默认为list作为操作。有没有办法同时包含两个操作?我认为这就是我的问题所在。 - StartingGroovy
感谢您的时间和帮助,目前我不会将负载按钮放在不同的位置。 - StartingGroovy

4

jjczopek的回答展示了如何在视图中提交数据后从控制器中获取访问权限。

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

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

然后在您的视图中,您可以使用以下代码再次检索它...
<g:textField name="text1" value="${params.param1}"/>

你还可以查看这个问题这些文档,这些对你也许有用。
如果想要通过域对象传递,则以下特定的呈现方法可能更好... Grails控制器 - 呈现

@Chris,你尝试过添加action="loadFile"吗?如果在g:submitButton中添加action参数,则value参数仅用于显示按钮文本。 - virtualeyes
我修改了我的回答,也许有些事情会变得清晰。我没有测试过这段代码,所以它可能无法按照预期工作。 - jjczopek
@Chris 有趣的是,在 grails.org 上查看 submitButton 时,它没有显示 action 属性。然而,当添加它时,它似乎仍在错误的位置查找。单击任何一个 submitButton 时,它都无法找到操作。即:drive/list?loadFiledrive/list?saveFile - StartingGroovy
感谢您的时间,目前我不会将负载按钮放在其他位置。 - StartingGroovy
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接