2010-03-19 2 views
4

Я вызываю компонент Coldfusion (cfc) с помощью jQuery.post(). Мне нужно целое или строковое представление числа, возвращаемого для использования в URL-адресе.Как заставить Coldfusion cfc выводить числовые данные через JSON в виде строки?

{"PAGE":"My Page Title","ID":19382} 
or 
{"PAGE":"My Page Title","ID":"19382"} 

Вместо того, что я вернусь десятичное:

{"PAGE":"My Page Title","ID":19382.0} 

Необходимо, чтобы обновить следующий HTML:

<a href="page.cfm?id=19382" id="pagelink">My Page Title</a> 

Концептуально, я полагаю, есть несколько ответов:

1) Я мог бы использовать jQuery для захвата числа слева от десятичной точки.

2) Я мог заставить Coldfusion отправить номер в виде строки.

3) Я мог бы генерировать всю серверную ссылку и просто заменить тег вся ссылка HTML (не предпочтительный ответ, но, возможно, это лучший)

Кто-нибудь знает, как сделать 1 или 2? Улучшено ли 3?

Соответствующие Javascript: (Не оптимизировано)

$(".link").live('click', function() { 
    var $linkID, serviceUrl; 
    serviceUrl = "mycfc.cfc?method=getPage"; 
    $linkID = $(this).attr("rel"); 

    $.post(serviceUrl, { linkid: $linkID }, function (result) { 
     $('#pagelink').val(result.TITLE); 
     if (result.FMKEY.length) { 
      // NEED the ID number WITHOUT the .0 at the end 
      $('#pagelink').attr("href") = "page.cfm?id=" + result.ID; 
      $('#pagelink').text(result.TITLE); 
     } 
    }, "json"); 
}); 

Мой CFC:

<component output="no"> 
<cfsetting showdebugoutput="no"> 
<cffunction name="getPage" access="remote" returnFormat="JSON" output="no" hint="Looks up a Page Title and ID"> 
    <cfargument name="linkID" type="string" required="yes"> 
    <cfset var page = queryNew("id,title")> 
    <cfset var result = structNew()> 
    <cfquery datasource="myDatasource" name="page"> 
     SELECT TOP 1 id, title 
     FROM pages 
     WHERE linkID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.linkID#">  
    </cfquery> 
    <cfif page.recordcount> 
     <cfset result.id = page.id> 
     <cfset result.title = page.title> 
    </cfif> 
    <cfreturn result> 
</cffunction> 
</component> 

ответ

4

parseInt() в JS. Kindda нравится ваше решение 1, но это проще, чем вы думаете.

$('#pagelink').attr("href") = "page.cfm?id=" + parseInt(result.ID, 10); 

CF сериализует любое целое число, как 123 в «123,0» по умолчанию, но обычно это не имеет значения в языке безтипного как JS или CF для дела.

поведение по умолчанию SerializeJSON() (что дистанционная функция используется) не может быть отменено, но если вы хотите, вы можете использовать один из третьей партии JSON библиотеки из www.riaforge.org

P.S. Даже если вы переходите к «something.cfm? Id = 123.0», URL.id - это просто числовое значение в CF, которое EQ равно 123. Хотя ваш URL-адрес выглядит немного странным, если он отправляется в CF, он все равно будет работать.

+0

Спасибо, Генри. Я думал, что сойду с ума. Рад, что я не единственный, кто сталкивался с этим. Также имеет смысл, что я мог бы использовать число с .0. Не думал об этом. –

0

2) Я мог бы заставить Coldfusion отправить номер в виде строки.

Выполняете ли вы какую-либо математику с идентификатором? Возможно нет. Что касается вашего jquery, это строка, которая содержит только числа, а не целое число. Рассматривайте это как таковое.

+0

Нет математики. Так что я окружаю число с кавычками на стороне сервера, чтобы заставить его к строке над JSON? –

8

Это известная ошибка/функция SerializeJSON(). См. this answer для возможного обходного пути.

+0

Дал вам голосование за мертвую идентификацию проблемы, а также разъяснение, что у Ралио нет этой проблемы. Тем не менее, решение Генри немного более управляемо, чем добавление пустого пространства и обрезка позже. (что я бы сделал, если другое решение не сработало.) Спасибо! :-) –

1

В качестве альтернативы, если вы предпочитаете использовать решение 2) «Я могу заставить Coldfusion отправлять число как строку», например, при использовании плагина, который ожидает строки, такие как dataTable, и не хочет прикасаться к клиенту код...

Просто пытается заставить число или строку, представляющее число, как показано ниже, не будет работать:

Test["caseSensitiveName"] = "#numericString#"; 

Но добавление ведущего места будет заставить JSON типа строки:

Test["caseSensitiveName"] = " #numericString#"; 

Hack взломать, но может пригодиться.

0

Подходя к этому под другим углом, если вы также управляете задним концом, вы можете попытаться заставить ColdFusion сериализовать число как целое число, используя javaCast («int», someIntegerThatColdFusionThinksIsAFloat).

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