2015-11-13 128 views
3

我想通过使用jQuery的post()方法调用通过ajax的cfc方法,但我不断收到一条错误消息,说“需要yyy函数的xxx参数但没有通过“。这是我的CFC功能:jQuery发布方法调用ColdFusion组件功能不起作用

<cffunction name="updateAssessment" returntype="struct" returnformat="json" access="remote" hint="For ajax update of a single assessment record"> 
    <cfargument name="data" type="JSON" required="true" hint="Data structure received from ajax call"> 

    <cfset var incomingData = "" /> 
    <cfset var qry = "" /> 
    <cfset var resultset = {success:false,message:"invalid data"}> 

    <cfif IsJSON(arguments.data)> 
     <cfset incomingData = deserializeJSON(arguments.data) /> 
    </cfif> 

    <cfreturn resultset /> 
</cffunction> 

,这里是jQuery代码调用它:

$('.ajaxSubmitBtn').on('click', function() { 

     //grab values from editable table cells... 
     var assessmentid = $.trim($(this).closest('tr').find('.ajaxSubmitBtn').val()); 
     var source = $.trim($(this).closest('tr').find('.sourceTD').text()); 
     var lname = $.trim($(this).closest('tr').find('.lnameTD').text()); 
     var fname = $.trim($(this).closest('tr').find('.fnameTD').text()); 
     var ssn = $.trim($(this).closest('tr').find('.ssnTD').text()); 
     var assessdate = $.trim($(this).closest('tr').find('.assessdateTD').text()); 
     var casehranum = $.trim($(this).closest('tr').find('.casehranumTD').text()); 
     var dob = $.trim($(this).closest('tr').find('.dobTD').text()); 

     //Put values in a JSON object... 
     var JSONPacket = { 
      "assessmentid":assessmentid, 
      "source":source, 
      "lname":lname, 
      "fname":fname, 
      "ssn":ssn, 
      "assessdate":assessdate, 
      "casehranum":casehranum, 
      "dob":dob 
      } 

     //call cfc function via ajax using post() 
     $.post("../../../cfc/starsImporter.cfc", {method: "updateAssessment", data: JSONPacket}, 
      function(response) { 
       console.log(response); 
      }, 
     "json"); 
    }); 

我清楚地传递所需的参数CFC功能与“数据:JSONPacket”,所以不知道是什么问题是。

回答

1

我想你需要单独传递参数。它现在写入的方式,jQuery是经过data结构作为串的钥匙状data[source]

$('.ajaxSubmitBtn').on('click', function() { 

    //grab values from editable table cells... 
    var assessmentid = $.trim($(this).closest('tr').find('.ajaxSubmitBtn').val()); 
    var source = $.trim($(this).closest('tr').find('.sourceTD').text()); 
    var lname = $.trim($(this).closest('tr').find('.lnameTD').text()); 
    var fname = $.trim($(this).closest('tr').find('.fnameTD').text()); 
    var ssn = $.trim($(this).closest('tr').find('.ssnTD').text()); 
    var assessdate = $.trim($(this).closest('tr').find('.assessdateTD').text()); 
    var casehranum = $.trim($(this).closest('tr').find('.casehranumTD').text()); 
    var dob = $.trim($(this).closest('tr').find('.dobTD').text()); 

    //Put values in a JSON object... 
    var JSONPacket = { 
     "method" : "updateAssessment", 
     "assessmentid":assessmentid, 
     "source":source, 
     "lname":lname, 
     "fname":fname, 
     "ssn":ssn, 
     "assessdate":assessdate, 
     "casehranum":casehranum, 
     "dob":dob 
     } 

    //call cfc function via ajax using post() 
    $.post("../../../cfc/starsImporter.cfc", JSONPacket, 
     function(response) { 
      console.log(response); 
     }, 
    "json"); 
}); 

CFC

<cffunction name="updateAssessment" returntype="struct" returnformat="json" access="remote" hint="For ajax update of a single assessment record"> 
    <cfargument name="assessmentid" type="string" required="true" /> 
    <cfargument name="source" type="string" required="true" /> 
    <cfargument name="lname" type="string" required="true" /> 
    <cfargument name="fname" type="string" required="true" /> 
    <cfargument name="ssn" type="string" required="true" /> 
    <cfargument name="assessdate" type="string" required="true" /> 
    <cfargument name="casehranum" type="string" required="true" /> 
    <cfargument name="dob" type="string" required="true" /> 
    ... 
+0

这是正确的。 “数据”的原始单一参数首先具有无效类型的“json”。检查文档以获取cfargument类型的有效值列表。无论您使用哪种浏览器,都应该在开发者的工具中使用控制台和网络流量部分。另外,还有一个称为Fiddler的免费工具,非常适合这种情况。您可以使用它来帮助诊断Ajax调用,方法是检查请求标头以查看您创建的数据包是否将数据作为单独的表单元素发送,而不是“struct “或json值。 –

1

明白了 - 问题是,我需要在发布前字符串化的JSONPacket它到了cfc方法。并且,在创建JSON对象后放置一个分号。所以一切看起来像这样:

<cffunction name="updateAssessment" returntype="struct" returnformat="JSON" access="remote" output="false" hint="For ajax update of a single assessment record"> 
    <cfargument name="JSONPacket" type="string" required="true" hint="Data structure received from ajax call"> 

    <cfset var incomingData = "" /> 
    <cfset var qry = "" /> 
    <cfset var resultset = {success:false,message:"invalid data"}> 

    <cfif IsJSON(arguments.JSONPacket)> 
     <cfset incomingData = deserializeJSON(arguments.JSONPacket) /> 
    </cfif> 

    <cfreturn resultset /> 
</cffunction> 


$('.ajaxSubmitBtn').on('click', function() { 
     //console.log("Hello"); 
     var assessmentid = $.trim($(this).closest('tr').find('.ajaxSubmitBtn').val()); 
     var source = $.trim($(this).closest('tr').find('.sourceTD').text()); 
     var lname = $.trim($(this).closest('tr').find('.lnameTD').text()); 
     var fname = $.trim($(this).closest('tr').find('.fnameTD').text()); 
     var ssn = $.trim($(this).closest('tr').find('.ssnTD').text()); 
     var assessdate = $.trim($(this).closest('tr').find('.assessdateTD').text()); 
     var casehranum = $.trim($(this).closest('tr').find('.casehranumTD').text()); 
     var dob = $.trim($(this).closest('tr').find('.dobTD').text()); 
     var JSONPacket = { 
      "assessmentid":assessmentid, 
      "source":source, 
      "lname":lname, 
      "fname":fname, 
      "ssn":ssn, 
      "assessdate":assessdate, 
      "casehranum":casehranum, 
      "dob":dob 
      }; 

     $.post("../../../cfc/starsImporter.cfc", {method:"updateAssessment", JSONPacket:JSON.stringify(JSONPacket)}, 
      function(response) { 
       console.log(response); 
      }, 
     "JSON"); 
    });