CF 8 Ajax with CFSELECT BIND

I love the new AJAX functionality in ColdFusion 8, but I am running into problems using it.

As mentioned in Ben Forta’s blog you can use the BIND= attribute on a CFSELECT tag to populate the data from a CFC using AJAX.

The problem I had was that even using Ben’s samples I could not get the data to populate.  After alot of tinkering I finally got it to work by removing the onRequest() method from Application.cfc.  Why this affects this functionality is a mystery to me.  Really for the application I’m working on it’s not a big problem but on other projects it could be.

My second part of the problem is that I have a cfc directory that is OUTSIDE of the application’s root directory.  For example:

/website_root
/components
/images

Then I map /cacfc to /components and reference my cfc’s by prepending cacfc to the component IE. cacfc.database.data.   This works great as I can share components among applications easily enough.  But when I call the cfc with the bind attribute of the CFSELECT, ColdFusion looks for the cfc in the root directory.   Here’s an example:

1
2
3
4
5
6
<cfselect name="school_id"
bind="cfc:cfc.school.getSchoolsInCity(state_code={school_state_code},county_number={county},location_city={schoolcity})"
value="school_id"
display="school_name"
required="true"
class="formField"/>

The AJAX debugger looks for the cfc /school.cfc which obviously doesn’t exist.   If I move the cfc to a directory under the web root (ie /cfc) it works.

Either I am doing something terribly wrong or these are 2 bugs in CF8.

Update from Ben on his Blog:

Matt,

The mapped directory problem is a known one, and I believe is to be addressed in the updater due out shortly.

The onRequest() issues sounds sounds like the same limitation with Web Services and more, and is documented as a restriction.

— Ben
# Posted By Ben Forta | 1/30/08 10:49 AM

Comments

  1. Sid Maestre says:

    Thanks for the post on binding to a cfselect. Have you found out why the OnRequest function in the application.cfc file interferes with cfselect data binding? I was having the same problem and your solution worked for me.

    I found a work around using bind=”url:ajax.cfm?action=getStuff()” as a substitute for bind=”cfc:cfc.foo.getStuff()”

    I prefer calling the cfc directly for security reasons.

    • Scratty says:

      Sid,

      I agree with you on calling the CFC directly. The URL method seems more like a hack to me, but ….

      On the onRequest(), Ben Forta’s reply was:

      “The onRequest() issues sounds sounds like the same limitation with Web Services and more, and is documented as a restriction.”

      Make sense but a bit limiting.

  2. gowri says:

    i want to select one select option then it efect will show on to the another select option box

  3. Matt, as you pointed to Ben’s quote, the onRequest method is problematic for web services, Flash Remoting, etc. The problem is you are trying to call “whatever.cfc” and onRequest is attempting to serve the file to the browser vs allow a direct call to a method int he cfc.

    To get around it use onRequestStart or do a check to see if the requested filename is your remote cfc.
    [coldfusion]








    [/coldfusion]

  4. Chris says:

    You can deal with this dynamically at runtime, and still keep onRequest for cfm pages:
    [coldfusion]
    <cffunction name="onRequestStart">
    <cfargument name="targetpage">
    <!— Remove the onRequest method for remote cfc calls, otherwise we’ll get a blank response —>
    <cfif listlast(arguments.targetpage, ".") is "cfc">
    <cfset StructDelete(this, "onRequest") />
    <cfset StructDelete(variables,"onRequest")/>
    </cfif>
    </cfargument></cffunction>
    [/coldfusion]

  5. Ross says:

    You don’t need to remove the entire onRequestStart method. I initially ran into problems with Ben’s example because my onRequestStart and End methods were including my header and footer HTML. Changing my code to this allowed the bind to work:

Speak Your Mind

*