I'm working on a form that uses AJaX (jQuery) to submit the form data, after the fields have been serialized.
I've done this several times, and never had a problem.. until this. I've compared this code to the code that is working elsewhere, and I'm just not seeing any differences that could cause my issue.
Here is some pseudo-code:
<form name="peopleSave" id="peopleSave" method="post">
<input type="text" name="firstName" id="firstName" value="" /> First Name
<br /><input type="text" name="lastName" id="lastName" value="" /> Last Name
<br /><input type="button" name="submitBtn" id="submitBtn" value="Submit" class="sbmt" />
Here is actual code:
var formObj = document.forms[formObjId],
postURL = "/components/recs.cfc?method=updMuster",
contentType = "application/json";
postData = $('#' + formObjId).serializeArray();
$('#content div').html('Update Failed');
validateData($(this).parent('form').attr('id'));// use ID of form as argument - it works.
Now, in the component (set for output just for debugging), all I'm doing is "cfdump var='#form#'" which returns an empty struct. Nothing. Form exists with a structcount of 0 (zero).
I can see in FireBug that the data is being posted. The form _is_ sending the data - but the component isn't seeing any data, just an empty form.
This is working on three other forms on another project. Why is this _not_ working, here?
I haven't worked with jQuery's serializeArray() in a while, but does it actually send a normal form post payload, or does it send a JSON packet?
Hi, Carl Von Stetten,
According to the jQuery Docs:
of objects, ready to be encoded as a JSON string. It operates
on a jQuery collection of
forms and/or form controls.
The thing that is really confounding me is that it works on one project, but not on this project, and they are both on the same dev server, so it's not the environment that is killing it.
I read those docs. What isn't clear to me is whether that is transmitted to your server side code as a typical form post or as a JSON packet that you then have to deserialize. If the latter, than I would not expect to see the form inputs/values end up as ColdFusion form scope variables. In your other projects, is the .serializeArray() resulting in a typical form post on the server?
It also looks like jQuery's serialize() method will build a typical URL query string (variable1=value1&variable2=value2). Would that work?
From the other projects (where it works), the actual form is submitted. You _could_ use JSON.stringify(form) before sending, which would require DeserializeJSON() on the CF side, but I believe the .serializeArray() will send the form as a form. At least, that's the way it's working on my other projects. I've tried (just for this message) checking to see if what is sent is in JSON format (ie, "IsJSON(form)"), and it is not. I am not paraming the form scope before the CFDUMP, so if the form didn't exist, it would error.
Not sure if the client (DoD) would allow a GET - this will eventually be running under SSL/TLS, so I'm going to assume that they would prefer a POST. Every other form submit that we've done, for them, is POST.
Thank you, and V/r,
I believe that when you submit to a CFC with access="remote", the form values arrive in the ARGUMENTS scope, rather than the FORM scope. I tried to find an example in some of my own code to verify this, but I don't currently have any remote CFCs.
Odd. The other project doesn't receive the form in the arguments scope. I'll give that a shot, though, just to see what will happen.
UPDATE: No.. checking for arguments.form did not change anything. This is really odd.
I'm including two screenshots of FireBug, here, hoping that someone might be able to identify what is going wrong.
The first one is of the POST data captured from a form submit (using the same code) that is successful.
Next is a screencap of what is POSTed from the project that is giving me this issue. I'm not sure what is going on, here, but it seems pretty obvious that (despite being the same code) this isn't the same process.
So the working form is including "Parameters" that the second form isn't. Yet the code is the same. Both are using the same version of jQuery (1.11.2).
What could be causing this?
In my previous post, when I said the form data would appear in the ARGUMENTS scope, I didn't mean ARGUMENTS.form. Each form input would land in the ARGUMENTS scope individually, so a form input named "input1" should result in an ARGUMENTS.input1 variable. Maybe this old Ben Nadel blog post will illustrate it better: Ask Ben: Building An AJAX, jQuery, And ColdFusion Powered Application
I don't know if this is related to your problem, but I notice the screencap where it is working shows "application/x-www-form-urlencoded" alongside the Parameters heading, while the broken screencap doesn't. Is there something different in the form tag definition between the working and non-working pages? How about comparing the headers?
I'll see if I can dump the arguments scope, somehow - probably email it, since the CFC doesn't output.
And both forms have enctype="application/x-www-form-urlencoded" attribute.
But you deserve the credit for it, Carl. I just noticed (thanks to your suggestion) that although the FORM has the correct enctype, the AJaX did not. The other form was sending JSON, and this code (copied from the other) was setting contentType="application/JSON", and my eyes kept skipping over it. THANK YOU!!