0

我有一个cfc

<cffunction name="addEditPerson" access="remote" returntype="struct">
a bunch of cfarguments

<cfscript>
            var returnThis = structNew();
            var error = '';
            structInsert(returnThis,'success',0,true);
            structInsert(returnThis,'error','',true);
            structInsert(returnThis,'personID',arguments.personID,true);
            if (trim(arguments.fname) == ''){error=error&'<li>Enter a First Name</li>';}
            if (trim(arguments.lname) == ''){error=error&'<li>Enter a Last Name</li>';}
            if (len(trim(arguments.username)) lt 5){error=error&'<li>Enter a User Name (at least five(5) characters long)</li>';}
            if (trim(arguments.password) == ''){arguments.canLogin = false;}
            if (error != ''){
            structUpdate(returnThis,'error',error);
            return returnThis;
        }
</cfscript>

cfc 显然还有更多内容,但我似乎无法从结构中返回错误。
我正在使用这个 jquery 语句:

$("#addNewPerson").click(function(){
            var fName = $("#newPersonFname").val();
            var lName = $("#newPersonLname").val();
            var companyName = $("#newPersonCompanyName").val();
            var userName = $("#newPersonUserName").val();
            var roleID = $("#newPersonRole").val();
            var dataStr = 'fName='+fName+'&lName='+lName+'&companyName='+companyName+'&userName='+userName+'&roleID='+roleID;
              $.ajax({
                  type:"POST",
                  url:"/cfc/people.cfc?method=addEditPerson&returnformat=json",
                  data: dataStr,
                  cache:false,
                  success: function(msg) {
                  $("#newPersonError").html(msg.ERROR);
                  }
              });

        });

但在成功声明中,我不确定如何访问从 cfc 返回的结构。我想我可以调用 msg.error 并获取信息,但我不能。我在firedox中使用firebug,我可以看到它正在发出POST请求,但响应完全为空。我不知道它是否会有所作为,但这里是表格:

<div id="personForm">

    <div class="pageHeader">Add New Person</div>
    <div id="newPersonError"></div>
    First Name : <input id="newPersonFname" type="text" name="newPersonFname" value=""><br/>
    Last Name : <input id="newPersonLname" type="text" name="newPersonLname" value=""><br/>
    User Name : <input id="newPersonUserName" type="text" name="newPersonUserName" value=""><br/>
    Company Name : <input id="newPersonCompanyName" type="text" name="newPersonCompanyName" value=""><br/>
    Role : <select id="newPersonRole" name="newPersonRole">
                <option value="0">Select person's role<cfoutput query="roleList"><option value="#roleID#">#role#</cfoutput>
            </select><br/>
    <input id="addNewPerson" type="button" name="addPerson" value="Add New Person">
</div>

非常感谢任何帮助,兰斯

4

2 回答 2

2

首先,使用JSON(默认是WDDX,比死还死)!有两种方法可以做到。在 cffunction 或 $.ajax(url="...?returnformat=json" 中添加 returnformat="json"

那么应该是使用jQuery $.post 或者$.ajax 的问题,并设置回调函数吧。

于 2010-01-20T22:25:04.640 回答
0

我会在带有 id 的输入周围使用表单标签。

<div id="container">
<form id="personForm">
    ...
</form>
</div>

确保您为该 CFC 关闭或抑制了 Coldfusion 调试。调试会破坏返回的 json 数据。

此外,创建一个标准 CFM 页面,初始化 cfc,然后 cfdump 调用页面主体中的函数。确保您对输出感到满意。如果结构有任何错误,用这种方式调试它比使用 jQuery 和 firebug 更容易。一旦它工作,然后从 jQuery 调用它。

您可以简化您的 jQuery 语句:

var peopleUrl = '/cfc/people.cfc?method=addEditPerson';

$.post(peopleUrl, $('#personForm').serialize(), function (msg) {
    $("#newPersonError").html(msg.ERROR);       
}, "json");

jQuery 的 .serialize() 方法将大大简化您的 javascript,因为您已将表单变量命名为与 url 参数相同。

请记住,javascript 区分大小写,而 Coldfusion 不区分大小写。我相信 Coldfusion 通过远程返回所有大写字母。我认为通过将“ERROR”全部大写来表示正确。

于 2010-01-20T23:22:10.217 回答