通过Jquery ajax将javascript对象传递给webservice

时间:2010-12-31 16:58:53

标签: javascript jquery ajax web-services object

我有一个返回对象的web服务

[WebMethod]
    public List<User> ContractorApprovals()

我还有一个接受对象的网络服务

[WebMethod]
    public bool SaveContractor(Object u)

当我通过Jquery进行web服务调用时:

function ServiceCall(method, parameters, onSucess, onFailure) {
    var parms = "{" + (($.isArray(parameters)) ? parameters.join(',') : parameters) + "}"; // to json
    $.ajax({
        type: "POST",
        url: "services/"+method,
        data: parms,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            if (typeof onSucess == 'function' || typeof onSucess == 'object')
                onSucess(msg.d);
        },
            error: function(msg, err) {
            $("#dialog-error").dialog('open');}
});

我可以打电话给第一个就好了。我的onSucess函数传递了一个javascript对象,其结构与我在服务上的User对象完全相同。

但是,我现在无法将对象恢复到服务器。

我接受Object作为服务器端的参数,所以我无法理解那里存在问题。所以我在想客户端的parms有问题,但我不确定是什么......

我正在做一些事情

ServiceCall("AuthorizationManagerWorkManagement.asmx/ContractorApprovals",
      "",
      function(data,args){$("#div").data('user',data[0])},
      null)

然后

ServiceCall("AuthorizationManagerWorkManagement.asmx/SaveContractor",
      JSON.stringify({u: $("#div").data("user")}) //dont work $("#div").data('user'), //These also do not work: "{'u': ' + $("#div").data("user") + '}", NOR JSON.stringify({u: userObject})
      function(data,args){(alert(data)},
      null)

我知道第一个服务呼叫有效,我可以获取数据。第二个是导致“onFailure”方法执行而不是“OnSuccess”。

有什么想法吗?

更新:

我使用了最后一个代码块:JSON.stringify({u: $("#div").data("user")})

我现在得到Invalid object passed in, member name expected. (1):

但是我不知道这意味着什么...... Google已经发现了很多错误,但没有像我这样的问题...

3 个答案:

答案 0 :(得分:0)

params序列化到json并将json发送到你的服务器端方法对我来说似乎很可疑,我会在这段代码上添加更多测试......

答案 1 :(得分:0)

 ServiceCall("AuthorizationManagerWorkManagement.asmx/SaveContractor",
            "{u: " + JSON.stringify($("#div").data("user")) + "}",
            function(data, args) { alert(data); },
            FailedServiceCall);

答案 2 :(得分:0)

好的,我已经发布了代码以及点击here上的链接!

    Default.aspx
        <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs"   Inherits="_Default" %>             
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
    <script type="text/javascript">
        var url = '<%=ResolveUrl("~/WebService.asmx/HelloWorld")%>';
        $(document).ready(function() {
           $('#txtAutoSuggest').keyup(function() {
                var str = $("#txtAutoSuggest").val();
                var a = JSON.stringify({ name: str });
                CallService(a);
                  });

        });

     function CallService(a) {
        $.ajax({
            type: "POST",
           url: url,
           data: a,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
           success: function(data, status) {
                $('#lblResult').text(data.d);
            },
            error: Error
        });
    }
    function Error(request, status, error) {
        $('#lblResult').text("Not Matched");
    }
</script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="txtAutoSuggest" runat="server"></asp:TextBox>
        <asp:Label ID="lblResult" Text="&nbsp;" Width="100%" runat="server" />
    </div>
</form>
</body>
</html>

OR

的application.js

 var url = '<%=ResolveUrl("~/WebService.asmx/HelloWorld")%>';
        $(document).ready(function() {
            $('#txtAutoSuggest').keyup(function() {
                var str = $("#txtAutoSuggest").val();
                var a = JSON.stringify({ name: str });
                CallService(a);
            });

        });

    function CallService(a) {
        $.ajax({
            type: "POST",
            url: url,
            data: a,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(data, status) {
                $('#lblResult').text(data.d);
            },
            error: Error
        });
    }
    function Error(request, status, error) {
        $('#lblResult').text("Not Matched");
    }




<%@ WebService Language="C#" Class="WebService" %>
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Collections;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;




 [WebService(Namespace = "http://tempuri.org/")]
 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

//允许使用ASP.NET AJAX或JQuery从脚本调用此Web服务。

[System.Web.Script.Services.ScriptService]
 public class WebService  : System.Web.Services.WebService {

    [WebMethod]
    public string HelloWorld(string name)
    {
        Utility ut = new Utility();  // some class where you will have your database connection
        ArrayList suggestedProblemName = ut.getItems(name);  // some method of the class
        return ""+suggestedProblemName[0];
    } 
}