2010-10-22 3 views
10

У меня есть ColdFusion функции CFC, как это:Как передать переменную массива в удаленный метод ColdFusion CFC через ajax с помощью jQuery?

<cffunction access="remote" name="getResults" 
    returntype="struct" 
    returnformat="JSON" 
    output="no"> 

    <cfargument name="q" required="true" type="array" /> 

... 
</cffunction> 

Как назвать эту функцию из JQuery? Ни одна форма кодирования массива jQuery не заставит ColdFusion видеть значение как массив.

Если вы передадите «q = a & q = b» (например, с помощью jQuery.ajaxSettings.traditional = true), функция получит строку «a, b», а не массив. Хотя разделение на запятую может показаться возможной, оно не будет работать, если одно из значений «q» содержит запятую. Кроме того, в идеале, функция на стороне сервера не должна знать о проблемах, связанных с сериализацией данных по проводу, и должна продолжать принимать массив.

Если вы передадите «q [] = a & q [] = b" (по умолчанию jQuery), он не будет отображаться на параметр «q». Если вы попытаетесь изменить имя параметра «q» на «q []», CFC выйдет из-за неправильного имени параметра.

ответ

8

Первое, что нужно знать, это jQuery Ajax requests do not encode arrays so have you to use something else to encode the data (это где jquery.JSON.js происходит от ссылки ниже). Таким образом, с JSON закодированным нашел там, я тогда понял, правильный синтаксис, работая с cfajaxproxy и изучением URL он генерирует в Firebug:

http://localhost/remote.cfc?method=getResults&argumentCollection=%7B%22q%22%3A%5B1%2C2%5D%7D

Да «argumentcollection» подход является правильным, и переменным «q» со ссылкой на массив находится там.

Я использовал следующий код в качестве испытательного стенда:

remote.cfc

<cfcomponent output="false"> 
    <cffunction access="remote" name="getResults" 
     returntype="struct" 
     returnformat="JSON" 
     output="no"> 

     <cfargument name="q" required="true" type="array" /> 

     <cfreturn {a=1,b=2}> 
    </cffunction> 
</cfcomponent> 

remote.cfm, чтобы увидеть, как cfajaxproxy генерирует URL

<cfajaxproxy cfc="Remote" jsclassname="Remote"> 
<cfoutput> 
<script language="javascript" type="text/javascript"> 
var oRemote = new Remote(); 
alert(oRemote.getResults([1,2])); 
</script> 
</cfoutput> 

дистанционный пульт.HTML делает это с JQuery

<script language="javascript" src="http://code.jquery.com/jquery-1.4.3.min.js"></script> 
<script language="javascript" src="jquery.JSON.js"></script> 
<script language="javascript" type="text/javascript"> 
var argumentCollection = { q: [1,2] }; 
$.ajax({ 
    url:  'remote.cfc', 
    data:  { 
     method: 'getResults', 
     argumentCollection: $.JSON.encode(argumentCollection) 
    }, 
    success: function(response) { 
     alert(response); 
    }, 
    dataType: 'json' 
}); 

</script> 
+0

Ну, я бы сказал, что jQuery действительно кодирует массивы, просто не так, как может принять ColdFusion. По умолчанию в jQuery 1.4.3 массивы кодируются в моде, совместимом с PHP и Ruby on Rails, путем предоставления нескольких параметров с именем параметра, которое добавляет «[]» к имени переменной. Используя «традиционный» параметр, он кодирует их так же, как HTML-форма для нескольких флажков, просто отправляя несколько параметров. Ваш подход к тому, чтобы понять это, соответствовал моей. Спасибо за подробный образец кода! – jrduncans

+0

У меня похожие проблемы сегодня, начиная с Angular 4 до CF10. работа 'argumentCollection' все еще работает. Отправка массива JSON в качестве аргумента формы не выполняется. Стоит отметить, что изменение типа аргумента CFC от 'array' до' any' позволит CFC-коду обрабатывать аргумент в виде массива с помощью функции argumentsCollection. – JeffryHouser

-1

Как насчет проверки значений для запятых и их экранирования перед переходом к Coldfusion, затем используйте ListToArray для преобразования и (при необходимости) перекодировать запятую?

+0

В идеале функция CFC не должны меняться, так что он может быть вызван на стороне сервера в нормальном режиме. Я уточнил вопрос, чтобы уточнить это. – jrduncans

+0

Понял, похоже, вы нашли хорошее решение. –

6

Исследуя эту проблему, я нашел следующее сообщение в блоге: http://www.coldfusionjedi.com/index.cfm/2010/3/23/Using-jQuery-to-post-an-array-to-a-ColdFusion-Component - Это позволяет предположить, кодирующая массив в виде строки JSON, а затем десериализации его внутри метода CFC, с неудачным воздействием требующих функции CFC, чтобы изменить иметь дело с JSON.

Итак, я исследовал дальше, и вот лучшее решение, которое я нашел до сих пор.

Просмотрев HTTP-вызовы, выполненные при использовании cfajaxproxy, я обнаружил, что вы можете отправить один параметр аргументаCollection в виде строки JSON для вызова удаленного метода CFC.

Так на стороне клиента вызов выглядит следующим образом (с помощью JQuery-плагин JSon сделать сериализации):

var params = {q: ['a', '1,2,3']}; 

$.getJSON('My.cfc?method=getResults', {argumentCollection: $.toJSON(params)}, function(data) { 
// handle data 
}); 
+0

psst ... Я думаю, что вы где-то сбросили ']. –

Смежные вопросы