Отправка всей области формы в 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. Я не хочу этого. Я так разочаровался в попытках использовать ajax с ColdFusion. Я готов прибегнуть к простому использованию jQuery для его отправки. Я могу сделать это jQuery... однако я не знаю, как получить поля в структуру. (Эта форма будет большой...) Я хотел бы посмотреть, как отправлять информацию формы в виде структуры либо в ColdFusion, либо в jQuery. Я хочу иметь возможность сохранять имена полей формы.

Даже если бы кто-то мог указать мне правильное направление... это было бы здорово. Я когда-то пытался найти ХОРОШИЙ учебник по этому вопросу, но тоже не смог.


person Bri    schedule 15.07.2011    source источник
comment
Вы не можете сделать это прямо в jQuery, используя метод jQuery serialize() в самой форме? api.jquery.com/serialize   -  person charliegriefer    schedule 15.07.2011
comment
Почему информация формы должна отправляться в виде структуры? Если вы должны были использовать serialize(), он передает строку пары ключ/значение. Не можете ли вы изменить метод updateRequest(), чтобы он принимал строку, а затем манипулировал строкой внутри? Черт возьми, передайте его частному методу, который создает структуру из пар ключ/значение, и теперь у вас есть структура CF, с которой можно работать.   -  person charliegriefer    schedule 15.07.2011
comment
Что ж, я хочу иметь возможность обрабатывать загрузку файлов ... У меня сложилось впечатление, что вам нужно имя поля формы ... Я где-то читал, что есть способ сделать это ... Я попробую ваше предложение.   -  person Bri    schedule 15.07.2011
comment
Кроме того, я бы хотел, чтобы это было в структуре, поэтому мне нужно ввести только один аргумент... потому что я ленивый! :П   -  person Bri    schedule 15.07.2011
comment
Итак, обновление: я понял, что мой jquery не работает, потому что... Я ЗАБЫЛ поля AJAX HATES FILE. ›:( Все равно делать асинхронность с файлами? :(   -  person Bri    schedule 15.07.2011


Ответы (4)


Если вы хотите передать элементы управления формой в виде структуры, я бы сначала попытался сериализовать элементы формы в виде строки json, а затем передать эту строку вашему веб-сервису. Затем из своего веб-сервиса вы можете использовать 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>
person Jake Feasel    schedule 15.07.2011
comment
Спасибо за ответ! Однако моя проблема переросла в случай... как обрабатывать загрузку... и по-прежнему отправлять форму асинхронно. Переходим к плагину формы. - person Bri; 15.07.2011

Использовать функцию 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

person Henry    schedule 15.07.2011
comment
Хорошая мысль. Но документы говорят, что он не отправляет поля файла. help.adobe.com/en_US/ColdFusion/9.0/ CFMLRef/ - person Leigh; 16.07.2011
comment
@Leigh Для этого вам понадобится XmlHttpRequest 2 HTML5: css.dzone.com/news/ загрузка файла и выполнение - person Henry; 16.07.2011
comment
@ Генри Я решил использовать плагин формы jQuery ... однако я пытаюсь понять, как захватить все поля формы сразу, а не иметь отдельные аргументы для каждого поля. - person Bri; 18.07.2011

Я думаю, у вас могут возникнуть проблемы с загрузкой всего, если вы хотите включить поле файла и его содержимое. Безопасность в браузерах не позволит вам прочитать файл (что вам нужно сделать, чтобы загрузить его содержимое через запрос ajax). Как уже упоминалось, использование сериализации даст вам другое содержимое формы, которое вы можете декодировать на сервере. если вам действительно нужно содержимое файла, вам может потребоваться отправить форму в скрытый 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), чтобы следить за тем, что загружается, и убедиться, что вы расшифровываете то, что загружен правильно

Редактировать: переполнение стека скрыло мой тег iframe в приведенном выше примере. Я также протестировал пример в Chrome и FireFox на Mac, и, похоже, он работает нормально.

person barnyr    schedule 18.07.2011
comment
Я мог бы просто придерживаться старого способа на данный момент. Загрузка файлов меня убивает. Я всегда получаю запросы на черновые формы, которые также имеют загрузку файлов. Придется еще поэкспериментировать, когда будет время. - person Bri; 19.07.2011

Я думаю, что вы ищете тег и что-то вроде этого:

<cfajaxproxy bind="cfc:mycfc.myfunction(arg1={myform:myfield1},arg2={myform:myfield2})" />

На самом деле вы не указываете действие в URL-адресе, как вы это сделали, вы вызываете его через прокси-сервер ajax.

Я думаю, это то, что вы пытаетесь сделать, может быть неправильно, дайте мне знать :)

person Nate    schedule 15.07.2011
comment
Я думаю, что я просто собираюсь прекратить это.. Честно говоря, я даже не понимаю, что делает этот тег. :( Я поклялся, что видел какой-то другой способ сделать асинхронную отправку в cfc, просто установив действие... но я нигде не могу его найти. Может быть, это был сон... - person Bri; 15.07.2011