Как получить доступ к идентификатору параметра URL в Coldfusion, если после хештега #?
После попытки около часа безуспешно... (coldfusion8
) глупый вопрос, но я застрял
Мой URL (Jquery Mobile, нет pushstate, поэтому он выглядит так):
http://www.page.de/test/mem/search.cfm#/test/mem/search.cfm?id=9900000003869
Если я выведу:
<cfdump output="e:\website\dump.txt" label="catch" var="#url#">
Я получаю это:
catch - struct
ID: 9900000003869
Но как мне получить к нему доступ... Я пытаюсь навсегда, ничего не работает
<cfdump output="e:\website\dump.txt" label="catch" var="#id#">
<cfdump output="e:\website\dump.txt" label="catch" var="#ID#">
<cfdump output="e:\website\dump.txt" label="catch" var="#url.id#">
<cfdump output="e:\website\dump.txt" label="catch" var="#url.ID#">
<cfdump output="e:\website\dump.txt" label="catch" var="#StructGetValue(url,"id")d#">
...
Спасибо за помощь!
3 ответа
Хорошо... Это работает:
URL = http://www.page.de/test/mem/search.cfm#/test/mem/search.cfm?id=9900000003869
<cfset objRequest = GetPageContext().GetRequest() />
<cfset strUrl = right( objRequest.GetRequestUrl().Append( "?" & objRequest.GetQueryString() ).ToString(), 13)>
Если кому-то будет проще, пожалуйста, напишите. Я проверю как ответ.
Проведя некоторое исследование по идентификаторам фрагментов (что для меня является новым термином:(), вызванное комментариями Питера и Дункана, я нашел из вики: http://en.wikipedia.org/wiki/Fragment_identifier
Идентификатор фрагмента функционирует иначе, чем остальная часть URI: а именно, его обработка выполняется исключительно на стороне клиента без участия сервера - конечно, сервер обычно помогает определить тип MIME, а тип MIME определяет обработку фрагментов. Когда агент (например, веб-браузер) запрашивает ресурс у веб-сервера, агент отправляет URI на сервер, но не отправляет фрагмент. Вместо этого агент ожидает от сервера отправки ресурса, а затем агент обрабатывает ресурс в соответствии с типом документа и значением фрагмента.
Теперь, когда ваш клиент отправляет фрагмент, а переменная url по какой-то причине доступна вам, я использую это в моем первоначальном посте.
<cfoutput>
обычно вы выводите переменную или другие оценки на экран.
<cfset myName = "Travis">
<cfoutput>Hello, my name is #myName#</cfoutput>
Вы также можете получить доступ к переменной, используя ее в выражении, которое нигде не выводится.
<cfset myFullName = myName & " Mak">
Вы также можете использовать переменные в запросе
<cfquery name = "qSomeQuery" datasource = "#application.dsn#">
select * from table where id = #url.id#
</cfquery>
Однако это плохой способ использовать его в запросе, вы всегда должны использовать параметр cfquery.
<cfquery name = "qSomeQuery" datasource = "#application.dsn#">
select * from table where id = <cfqueryparam cfsqltype="cf_sql_integer" value="#url.id#">
</cfquery>
Проблема, возникающая при тестировании переменной, связана с неправильным синтаксисом.
<cfif isDefined("url.id")>
вирши <cfif isDefined(url.id)>
более точный тест <cfif structKeyExists(url, "id")>
По какой-то причине мой CF-сервер усекает все в URL после #, но у вашего, похоже, нет этой проблемы. Как говорит ваш cfdump, вы можете видеть ваши переменные url, так что "получить доступ" к переменной url так же просто, как и использовать ее: #url.id#
или тестирую это <cfif isDefined("url.id")>
Вы пытаетесь прочитать это из текстового файла?
Можете ли вы не просто использовать:
<cfdump label="catch" var="#url.id#" />
Это работает?
РЕДАКТИРОВАТЬ:
Не могли бы вы попытаться захватить и отформатировать то, что вам нужно сначала, а затем после записи в файл?
Например, попробуйте использовать:
<cfsavecontent variable="myFileContents">
<cfoutput>#url.id#</cfoutput>
</cfsavecontent>
<cffile action="Write" file="e:\website\dump.txt" output="#myFileContents#" />
Я не проверял этот код, но попробуйте и посмотрите!
Возможно, вы захотите проверить эту переменную URL, используя isDefined()
Удачи.