任何人都可以帮我弄清楚为什么我无法通过ajax请求访问我的cfc,但通过浏览器没有问题?

时间:2010-12-13 21:38:34

标签: jquery ajax coldfusion cfc application.cfc

我正在使用ColdFusion MX7处理一个简单的表单。我有一对文本输入,我想根据cfselect中选择的内容填充。对我的CFC的任何Ajax调用都会返回404错误。如果我从浏览器访问CFC,则不会出现此类错误。我使用Ben Nadel为cfc制作自定义java代理的示例。 cfc与此脚本所在的cfm页面位于同一文件夹中。以下是相关代码:

 function RemoteCFC(){
        this.name = " ";
        return( this );
       }


      // This handles the remote calls to the CFCs.
      RemoteCFC.prototype.MakeRemoteCall = function(strMethod, objData, fnSuccess, fnError){

      // Create a data struct and extend it with the method
      // name and the data to be passed.
      var objRemoteData = {};

      // Extend the remote data set.
      $.extend(objRemoteData, objData, {method: strMethod, returnFormat: "json"});
      // Make the AJAX call to the remote method.
      $.ajax({type: "get", url: (this.Name + ".cfc"), data: objRemoteData, dataType: "json", 
             success: fnSuccess, error: fnError});

      // Return this for method chaining.
      return( this );
   }

   // Create a new core remote object. We will need this
   // to create the prototype chain such that the other
   // proxy classes can extend this.
   objRemoteCFC = new RemoteCFC();
   // Create a Javascript proxy for this given CFC.
   function RecallService(){
      this.Name = "RecallCountFunctions";
   }

   // Extend the core CFC Proxy functionality.
   RecallService.prototype = objRemoteCFC;


    RecallService.prototype.getInspected = function( objData, fnSuccess, fnError ){
        this.MakeRemoteCall( "getInspected", objData, fnSuccess, fnError );
    }

    //Define another remote method wrapper. 
    RecallService.prototype.getHeld = function( objData, fnSuccess, fnError ){
        this.MakeRemoteCall( "getHeld", objData, fnSuccess, fnError );
    }

   $(   
      function(){
        var myRecallService = new RecallService();

        $( "select[ name = 'CountChosen' ]" ).change( function(){
           var selectedCount = $( "select[ name = 'CountChosen' ]" );
           var inspected = $("input[name='numInspected']");
           var held = $("input[name='numHeld']");

           if (selectedCount.val() != "0"){
               EnableForm();
               myRecallService.getInspected({store: "#cgi.AUTH_USER#", id: selectedCount}, function
                      ( objResponse ){SetValue("inspected", objResoponse );}, function( objResponse ){
                      alert( objResponse.responseText );});                     
               myRecallService.getHeld({store: "#cgi.AUTH_USER#", id: selectedCount}, function
                      ( objResponse ){SetValue("held", objResponse);}, function( objResponse ){
                      alert( objResponse.responseText);});                      
           }
       });
   }

对于这篇长篇文章感到抱歉,我不想遗漏任何可能有用的东西。我也没有使用Application.cfc或onRequest方法,我听说可能会引起问题。

如果您需要查看我的cfc告诉我,我也可以发布。

修复是:

Change:
   id: selectedCount
To:
   id: selectedCount.val()

2 个答案:

答案 0 :(得分:1)

确保将CFC方法标记为access =“remote”。

如果您执行http://servername/path/to/cfc/nameofcfc.cfc?method=methodName&arg1=arg1value(用值替换值)是否有效?从中取出“ajax”

答案 1 :(得分:1)

除了Ray关于Firebug(或Charles或Fiddler或其他代理人可能会告诉你)的问题,如果它真的只是一个404错误肯定会有所帮助,如果不是这样的话,还有其他一些想法。

首先,当您说可以从浏览器访问它时,您的意思是http://yourserver/yourcfc.cfc?method=methodname吗?或者是其他东西?既然你展示你的ajax库添加returnformat = json,你是否也在URL上添加它以进行测试?

其次,当你说你没有使用application.cfc或cfm时,你是否意识到这不仅仅是该目录中是否有一个,而是父,祖父母中的任何一个,等等?你可能受到其中一个的影响。避免它的最简单方法(出于测试目的)是将空白的一个放入您正在呼叫的页面的目录中。

第三,如果查看application.log文件(在[cf] \ logs中,或通过CF Admin),它是否显示错误? Ajax客户端通常会隐藏它。确实,你提到了404.你确定那是没有被发现的CFC吗?报道的是什么?

CFC与提供此HTML / javascript的CF页面位于同一目录中吗?由于您只命名该文件,它似乎会在那里看。您是否在浏览器中使用示例网址对其进行了测试?