目前正努力尝试在ColdFusion中找出异步提交。我总是遇到麻烦。我有一个表单,我想提交给远程CFC并得到某种回应。 (最终这个表格将有一个类似函数的草稿......)我知道如何设置每个部分:表单和CFC。我的问题是连接他们!有一些关于这个的类似帖子,但没有提供足够的信息....至少对我来说。
形式:
<cfform action = "/cfc/request.cfc?method=updateRequest" method = "post" name = "requestForm" id = "requestForm" enctype="multipart/form-data">
........<!-- Fields redacted -->
</cfform>
CFC方法(这只是一个测试):
<cffunction name="updateRequest" access="remote" returntype="numeric">
<cfargument name="form" type="struct" required="yes">
<cfset var status = 0>
<cfreturn status>
</cffunction>
注意:我的CFC功能设置为遥控等等......
我的表单应该发布到cfc,但实际上它 到cfc页面。我不想要这个。尝试在ColdFusion中使用ajax让我变得非常沮丧。我准备好只使用jQuery来提交它。我可以做jQuery ...但是我不知道如何将字段放入结构中。 (这个形式会很大......)我想看看如何在ColdFusion或jQuery中将表单信息作为结构发送。我希望能够保留表单字段名称。
即使有人能指出我正确的方向......那也很棒。我曾经试图在这个问题上找到一个好的教程,而且还没有。
答案 0 :(得分:1)
如果要将表单控件作为结构传递,我首先尝试将表单元素序列化为json字符串,然后将该字符串传递给webservice。然后,您可以从Web服务中使用DeserializeJSON()将其转换回结构。这里有一些代码可以让你接近这个:
<script>
/* function prototype code modified from here: http://api.jquery.com/serializeArray/#comment-130159436 */
(function( $ ){
$.fn.serializeJSON=function() {
var json = [];
jQuery.map($(this).serializeArray(), function(n, i){
json.push('"' + escape(n['name']) + '":"' + escape(n['value']) + '"');
});
return '{' + json.join(',') + '}';
};
})( jQuery );
// make the request to your webservice
$.post('myComponent.cfc?method=updateRequest', { formJSON: $("#requestForm").serializeJSON()}, function () { /* handle response here. */ })
</script>
然后在您的CFC中,更改参数:
<cffunction name="updateRequest" access="remote" returntype="numeric">
<cfargument name="formJSON" type="string" required="yes">
<cfset var formStruct = DeserializeJSON(arguments.formJSON)>
<cfset var status = 0>
<cfreturn status>
</cffunction>
答案 1 :(得分:1)
使用ColdFusion.Ajax.submitForm
功能
<html>
<head>
<!--- The cfajaximport tag is required for the submitForm function to work
because the page does not have any Ajax-based tags. --->
<cfajaximport>
<script>
function submitForm() {
ColdFusion.Ajax.submitForm('myform', 'asyncFormHandler.cfm', callback,
errorHandler);
}
function callback(text)
{
alert("Callback: " + text);
}
function errorHandler(code, msg)
{
alert("Error!!! " + code + ": " + msg);
}
</script>
</head>
<body>
<cfform name="myform">
<cfinput name="mytext1"><br />
<cfinput name="mytext2">
</cfform>
<a href="javascript:submitForm()">Submit form</a>
答案 2 :(得分:1)
如果您想要包含文件字段及其内容,我认为您可能无法上传所有内容。浏览器中的安全性不允许您读取文件(为了通过ajax请求上传内容,您需要执行此操作)。如前所述,使用serialize将获得表单的其他内容,您可以在服务器上解码。 如果你真的需要文件的内容,你可能需要查看将表单提交给隐藏的iFrame,这不会导致页面重新加载,但应该通过文件发送:
<form action="saveCode.cfc?method=safeDraft" method="post" enctype="multipart/form-data" target="upframe">
Say Something: <input type="text" name="foo"><br>
Add a File: <input type="file" name="myfile"><br>
<input type="submit">
<iframe src="initial.html" id="upframe" name="upframe"></iframe>
我还强烈建议您使用Fiddler(fiddler2.com)观看上传的内容并确保正在解码正确上传的内容
编辑:Stack Overflow在上面的示例中隐藏了我的iframe标记。我还在Mac上测试了Chrome和FireFox中的示例,它似乎工作正常。
答案 3 :(得分:0)
我认为你要找的是标签,如下所示:
<cfajaxproxy bind="cfc:mycfc.myfunction(arg1={myform:myfield1},arg2={myform:myfield2})" />
您实际上并未在网址中指定操作,而是通过ajax代理调用它。
我认为这是你正在尝试的,可能是错的,让我知道:)。