如何从jquery / ajax将参数传递给[OperationContract] webservice方法?

时间:2010-12-08 22:43:23

标签: jquery ajax wcf web-services

我想从jquerys ajax将参数传递给我的webservice。我怎么能这样做?

我已经查看了一些相关问题,但找不到适合我的解决方案。我试过这个:jQuery AJAX parameter not being passed to MVC但是我没有使用mvc,所以我确信这就是为什么解决方案不起作用的原因。 我的jquery看起来像这样:

            $.ajax({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: "CarService.svc/GetCar",
                data: {CarID:117},
                dataType: "json",
                success: function (data) {
                    $("#lblCurrentTime").text("");
                    $("#lblCurrentTime").text(data.d.CarID);
                }
            });

我的'数据'部分有问题,对吗?如果保留数据:part作为数据:“{}”我可以让我的方法运行(我没有传递任何参数)但是当我尝试上面的firebug时,我告诉我:

Firebug's log limit has been reached. 0 entries not shown.  Preferences  
POST http://localhost:64461/TimeService.svc/GetCar
POST http://localhost:64461/TimeService.svc/GetCar

500 Internal Server Error
  1.12s

我的Web服务看起来像这样:

[OperationContract]
    public CarTable GetCar(int id)
    {
        using (var sqlc = new SqlConnection(@"sdfgsdfg"))
        {
            sqlc.Open();
            var cmd = sqlc.CreateCommand();
            cmd.CommandText = "HUGE QUERY HERE ^^";
            //id = 117;
            cmd.Parameters.Add("CarID", System.Data.SqlDbType.Int).Value = id;
            using (var reader = cmd.ExecuteReader())
            {
                CarTable Cars = new CarTable();

                while (reader.Read())
                {
                    Cars.CarID = reader["CarID"].ToString();
                    Cars.CarName = reader["CarName"].ToString();
                }


                return Cars;

            }
        }
    }
[DataContract]
public class CarTable
{
    [DataMember]
    public string CarID { get; set; }
    [DataMember]
    public string CarName { get; set; }
}

编辑:如果我将数据部分更改为:

data: CarID=117,

我收到Sys.ParameterCountException:参数计数不匹配。 [Break On此错误] {name:“format”,type:String}

4 个答案:

答案 0 :(得分:2)

首先,您应该验证是否包含属性

[WebInvoke (ResponseFormat = WebMessageFormat.Json)]

GetCar方法或在web.config中执行相同操作。

其次,您应该使用data:"117"data:JSON.stringify(117)代替data: {feat:117}

更新:如果你有一个更复杂的数据输入,例如作为一个对象CarTabledata参数应该是data:JSON.stringify({CarID: 117, CarName: "BMW"}),所以它应该以相同的方式构建。 JSON.stringifyhttp://www.json.org/js.html中定义。

还有一句话。成功返回数据后,您将看到返回的数据不应使用data.d.CarID访问,而应使用data.CarID访问。 ASMX Web服务将数据放在属性d中,但不放置在WCF服务中。

更新2 :我不知道你做了哪个小错误,所以我创建了一个小型WCF服务,可以满足您的需求。您可以在此处下载源代码http://www.ok-soft-gmbh.com/jQuery/WcfData.zip。为了确保您能够编译它,我使用了Visual Studio 2008.在Visual Studio 2010中,web.config文件可以更加简单。

答案 1 :(得分:2)

data: {CarID:117}, 

应该是:

data: "{'id':'117'}", 

data参数必须是字符串。需要引用名称和值对作为有效的JSON。名称/值对的名称应与Web服务的输入参数匹配。

答案 2 :(得分:1)

尝试更改

data: {CarID:117},

data: {id:117},

答案 3 :(得分:0)

我认为参数名称需要与服务上的呼叫相匹配。

尝试更改

data: {CarID:117},

到了 data: {ID:117},