Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails-控制器和视图之间的通信_Grails_View_Groovy_Textbox_Controller - Fatal编程技术网

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

Grails-控制器和视图之间的通信,grails,view,groovy,textbox,controller,Grails,View,Groovy,Textbox,Controller,我想知道如何从控制器中的列表中填充视图中的文本框,我已经搜索了一段时间的示例,但没有真正找到任何内容。我不确定如何准确地从视图访问文本字段,在Java中,您可以做一些像jTextField.getText()这样简单的事情。我还想知道如何抓取文本框中的文本 下面我将发布一些我正在做的示例代码 控制器: def loadFile = { def propFile = "c:/props.txt" def propMap = [:] def propList = []

我想知道如何从控制器中的列表中填充视图中的文本框,我已经搜索了一段时间的示例,但没有真正找到任何内容。我不确定如何准确地从视图访问文本字段,在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> 

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

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

<g:form controller="myController" action="saveFile">
  <g:textField name="properties"/>
  <g:submitButton name="saveFile" value="Save File" />
</g:form>
编辑: 为了解决后面评论中出现的一些问题,我将尝试提供更多的见解

假设控制器名为
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>


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

显示了如何在从视图提交数据后访问控制器中的数据

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

    params.param1 ='value to pass'
    render(view:"testView")
然后在您的视图中,您可以使用

<g:textField name="text1" value="${params.param1}"/>

你也可能会发现它是有用的

如果要传递域对象,则以下特定渲染方法之一可能会更好。。。

“println params?.properties”在窗体post上的控制器中,以查看为field@virtualeyes请原谅,我对应用程序的web端还比较陌生,但我看不出您希望我在哪里添加print语句。@SG,在def saveFile{},但这假设属性文本字段实际上是用数据post loadFile()填充的。我对groovy的了解远比对grails的了解要好得多——抓紧点,这对于一个全职grails用户来说是一个非常容易实现的成果rescue@Chris抱歉,我有一个
textArea
而不是
textField
。如何填充
文本区域
?通过迭代列表并将值分配给我的controller@Chris我继续,只是使用
getText()
从文件中抓取文本,而不是逐行查看。我还有一个问题,我已经编辑了原稿,如果有机会,请检查一下。也谢谢你的帮助,非常感谢@从Groovy开始,g:submitButton应该有一个“action”参数,指定要在控制器中使用的操作。例如action=“loadFile”它默认为“value”参数,但您现在有一个空格,这就是为什么我认为它不起作用的原因。@Chris,那么您是否尝试添加action=“loadFile”?如果将action参数添加到g:submitButton,那么值param将仅用于显示按钮文本我修改了我的答案,可能会清除一些内容。我没有测试此代码,因此它可能无法正常工作。这对于保存
textArea
的内容非常有用。现在,我只是在从文件加载它时遇到问题。感谢您提供的示例!我已经用添加的问题编辑了主要问题,请检查您是否有机会。我欣赏代码,但我认为问题涉及
actionSubmit
即使我像您那样添加action属性,两个按钮似乎也找不到操作。按下按钮时产生的链接是这样的:
drive/list?loadFile
drive/list?saveFile
我不确定它为什么要查找
list
关于可能发生的事情的任何想法?它似乎将默认
list
作为操作。是否有一种方法可以同时包含这两种操作?我想这就是我的问题所在谢谢你的时间和帮助,因为现在我不会把加载按钮放在不同的位置
    params.param1 ='value to pass'
    render(view:"testView")
<g:textField name="text1" value="${params.param1}"/>