Создание JSON возвращает "строки" из веб-сервиса для использования с jquery ajax - PullRequest
3 голосов
/ 08 декабря 2010

Я попытался внедрить простой веб-сервис в приложение asp.net, используя учебник, найденный здесь: http://dotnetslackers.com/articles/ajax/JSON-EnabledWCFServicesInASPNET35.aspx#1301 и http://dotnetslackers.com/articles/ajax/Using-jQuery-with-ASP-NET.aspx

Проблема в том, что мои данные возвращаются, как видно изЭтот снимок экрана (согласно Firebug): alt text

    $("#btnGet").click(function () {

        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "TimeService.svc/GetCar",
            data: "{}",
            dataType: "json",
            success: function (data) {
                alert(data.d);
            }
        });

    });

});

Мой метод веб-службы выглядит следующим образом:

[OperationContract]
public string GetCar()
{
    using (var sqlc = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\CarTracker.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"))
    {
        sqlc.Open();
        var cmd = sqlc.CreateCommand();
        cmd.CommandText = "SELECT CarID, CarName FROM tblCars";
        using (var reader = cmd.ExecuteReader())
        {
            string sCar = "";
            int testcount = 1;
            for (int i = 0; i < testcount; i++)
            {
                reader.Read();
                sCar += reader["CarName"].ToString();
            }


            return sCar; // Car_1
        }
    }
}

Итак, мои вопросы:

  1. Откуда взялся 'd' в firebug?

  2. Как мне построить "строки" в стиле JSON на основе моей базы данных, чтобы вернуться обратно в jqueryajax-функция?

В идеале я бы хотел, чтобы данные ajax jquery выглядели примерно так:

{"TotalCars": x, "CarList":[{"CarName":"x1", "CarID":"id1"},{"CarName":"x2", "CarID":"id2"}]} 

Итак, с jquery я могу делать такие вещи, как alert(data.TotalCars);все подобные вещи.

Пожалуйста, имейте в виду, что я очень новичок в этом, поэтому я ценю любую помощь, которую вы можете оказать.Заранее спасибо!<3 </p>

Ответы [ 2 ]

6 голосов
/ 08 декабря 2010

«d» используется каркасом веб-сервиса, чтобы сервис никогда не возвращал голый массив. Это сделано для того, чтобы обойти потенциальный межсайтовый эксплойт Javascript .

Вы хотите создать классы, описывающие ваш контракт с данными, например:

[DataContract]
public class CarCollection {
    [DataMember]
    public int TotalCars { get { return CarList.Count; }}
    [DataMember]
    public List<Car> CarList { get; set; }
}

[DataContract]
public class Car {
    [DataMember]
    public string CarName { get; set; }
    [DataMember]
    public string CarId { get; set; }
}

Тогда вы построите возвращаемое значение, используя эти классы. Вы также можете указать WCF принять метод HTTP GET и сериализацию JSON для ответа с атрибутом WebGet:

[OperationContract]
[WebGet(ResponseFormat=WebMessageFormat.Json)]
public string GetCar()
{
    // You will probably build this up from your databas
    var cars = new CarCollection { CarList = new List<Car>() {
        new Car { CarName = "x1", CarId = "id1" },
        new Car { CarName = "x2", CarId = "id2" },
        new Car { CarName = "x3", CarId = "id3" },
    }};

    return cars;
}

WCF автоматически сериализует ваш граф объектов в JSON и отправляет его обратно клиенту.

Затем вы также можете использовать упрощенный метод JQuery get:

$("#btnGet").click(function () {
    $.get("TimeService.svc/GetCar", function(data){
        alert(data);
    });
});
2 голосов
/ 08 декабря 2010

1) «ASP» в ответе JSON вставляется ASP.Net, чтобы служба не могла вернуть действительный оператор javascript, чтобы его нельзя было проанализировать и создать как новый объект в javascript для предотвращения межсайтовых сценариеватаки.

2) Веб-сервис автоматически превратит ваши .Net-объекты в JSON, если вы добавите веб-метод с помощью [ScriptMethod(UseHttpGet=true, ResponseFormat=ResponseFormat.Json)].Используя CarCollection от @joshperry, попробуйте:

[WebMethod()]
[ScriptMethod(UseHttpGet=true, ResponseFormat=ResponseFormat.Json)]
public CarCollection GetCars()
{
    CarCollection carResult = new CarCollection();
    ...
    return carResult;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...