将所有表单范围异步发送到CFC

时间:2011-07-15 18:03:57

标签: jquery ajax asynchronous coldfusion cfc

目前正努力尝试在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中将表单信息作为结构发送。我希望能够保留表单字段名称。

即使有人能指出我正确的方向......那也很棒。我曾经试图在这个问题上找到一个好的教程,而且还没有。

4 个答案:

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

http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-7a01.html#WS71B55A73-D08F-47c7-B062-0543793B83A5

答案 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代理调用它。

我认为这是你正在尝试的,可能是错的,让我知道:)。