我正在尝试获取2个链接的下拉列表。第一个显示远程服务器文件夹,选择后,第二个显示所选文件夹中的文件。接下来,我要将选择的文件复制到本地磁盘。但是我无法将文件名放入某个变量中以供以后使用。并且此列表是从 Controller 而不是gsp呈现的。点击此链接:http://grails.asia/grails-chained-select---load-data-on-one-dropdown-box-depending-on-another。
下拉列表呈现得很好,但是问题是我需要从第二个下拉列表(文件名)中选择一个值,以供 Controller 使用,以备将来使用。请帮我解决这个问题。
域类:
package filemanager
class SourceServ {
String sourceServName
String sourceServFolder
int sourceServPort
String sourceServUser
String sourceServPassword
String localFolder
Boolean selected
static hasMany = [destservs: DestServ]
static constraints = {
sourceServName blank: false, nullable: false
sourceServFolder blank: false, nullable: false
sourceServPort blank: false, nullable: false
sourceServUser blank: false, nullable: false
sourceServPassword blank: false, nullable: false
localFolder blank: false, nullable: false
selected nullable: true
}
static mapping = {
destservs cascade: "all-delete-orphan"
}
}
Controller :
package filemanager
import com.jcraft.jsch.*
import com.jcraft.jsch.ChannelSftp.*
class ChooseFromController {
SourceServ sourceServ
DestServ destServ
String value
String fileName
String name
def index(Integer max) {
params.max = Math.min(max ?: 10, 100)
model:[sourceServ: SourceServ]
}
//Вывод второго списка с файлами
def sourceServChanged(long sourceServId) {
sourceServ = SourceServ.get(sourceServId)
FileWork fileWork1 = new FileWork (sourceServ.getSourceServName(), sourceServ.getSourceServUser(), sourceServ.getSourceServPassword(), sourceServ.getSourceServFolder(), "C:/tmp/", sourceServ.getSourceServPort(), "null")
Session ses
ses = fileWork1.connect()
def fileList = fileWork1.getFileList(ses)
ses.disconnect()
render g.select(name:'fileName',
from:fileList, noSelection:[null:'-Choose file to copy-'])
//onchange:getFileName(this.value))
render fileName
}
def getFileName(input){
render "Hello" //input //fileName
}
def copyToLocal(String x) {
render fileName//sourceServ.getSourceServName()
}
}
GSP:
<%@ page contentType="text/html;charset=UTF-8" import="filemanager.SourceServ" import="filemanager.DestServ"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<meta name="layout" content="main"/>
<title>Выбор исходного сервера</title>
<g:javascript library='jquery' />
</head>
<body>
<div class="body">
<%--Список исходных серверов с составным option value(то, что выводится в списке)--%>
<b>Выберите исходный сервер и папку</b>
<div>
<g:select id="id" name="sourceServName" from="${sourceServ.list()}" value="${id}"
optionKey="id"
optionValue="${{it.sourceServName+it.sourceServFolder}}" noSelection="['':'-Choose source server-']"
onchange="sourceServChanged(this.value);"/> <%--Передача id в sourceServId--%>
</div>
<div>
<b>Выберите файл для копирования </b>
<span id="subContainer"></span>
</div>
<script>
function sourceServChanged(sourceServId) {
<g:remoteFunction controller="ChooseFrom" action="sourceServChanged"
update="subContainer"
params="'sourceServId='+sourceServId"/>
}
</script>
</div>
<br>
<%--<g:submitButton name="copyToLocal" class="button" value="copyToLocal" />--%>
<g:form controller="ChooseFrom">
<g:actionSubmit value="Submit" action="copyToLocal"/>
</g:form>
</body>
</html>
最佳答案
这里发生的是从您的JavaScript中将新的select元素呈现到窗体外部的范围“subContainer”中。尝试将span标签替换为form元素内
<g:form controller="ChooseFrom">
<span id="subContainer"></span>
<g:actionSubmit value="Submit" action="copyToLocal"/>
</g:form>
现在,当单击提交按钮时,它将值提交到ChooseFrom Controller中的copyToLocal操作。因此,从操作内部可以从params.fileName访问选定的值
关于grails - 从<g:select下拉列表中获取所选值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28532176/