Как я могу отправить переменную массива удаленному методу ColdFusion CFC через ajax, используя jQuery? - PullRequest
10 голосов
/ 22 октября 2010

У меня есть функция ColdFusion CFC:

<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 выдаст ошибку из-за неверного имени параметра.

Ответы [ 3 ]

8 голосов
/ 23 октября 2010

Первое, что нужно знать, это jQuery Ajax-запросы не кодируют массивы, поэтому вы должны использовать что-то еще для кодирования данных (это то, откуда jquery.JSON.js происходит из ссылки ниже). Итак, с помощью JSON-кода, найденного там, я затем выяснил правильный синтаксис, работая с cfajaxproxy и изучая URL, который он генерирует в Firebug:

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

Да, подход "подборка аргументов" является правильным, и переменная "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>

remote.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>
6 голосов
/ 22 октября 2010

Исследуя эту проблему, я обнаружил следующее сообщение в блоге: 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, я обнаружил, чтоВы можете отправить один параметр argumentsCollection в виде строки JSON для вызова удаленного метода CFC.

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

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

$.getJSON('My.cfc?method=getResults', {argumentCollection: $.toJSON(params)}, function(data) {
// handle data
});
0 голосов
/ 22 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...