Загрузка Handsontable из службы WCF с поддержкой AJAX

Я пытаюсь отобразить данные в Handsontable из службы WCF с поддержкой AJAX, но ничего не показывает.

CarsService.svc:

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

        [DataMember]
        public string Year { get; set; }
    }

    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class CarsService
    {
        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        public IEnumerable<Car> GetCars()
        {
            var cars = new List<Car>();
            var car1 = new Car()
            {
                Name = "Kia",
                Year = "2008"
            };
            var car2 = new Car()
            {
                Name = "Nissan",
                Year = "2009"
            };
            cars.Add(car1);
            cars.Add(car2);
            return cars;
        }
    }

WebPage:

<head runat="server">
    <title></title>
    <script type='text/javascript' src='/Scripts/jquery-1.8.3.js'></script>
    <script type='text/javascript' src="/Scripts/Handsontable/jquery.handsontable.js"></script>
    <script type='text/javascript' src="/Scripts/Handsontable/bootstrap-typeahead.js"></script>
    <script type='text/javascript' src="/Scripts/jquery.contextMenu.js"></script>
    <script type='text/javascript' src="/Scripts/jquery.ui.position.js"></script>
    <link rel="stylesheet" type="text/css" href="/Styles/jquery.contextMenu.css"/>
    <link rel="stylesheet" type="text/css" href="/Styles/Handsontable/jquery.handsontable.css"/>
</head>
<body>
    <form id="form1" runat="server">
        <script type='text/javascript'>

        $(window).load(function () {

            $.ajax({
                url: "/CarsService.svc/GetCars",
                type: "GET",
                dataType: "json"
            })
            .success(function (result) {
                $("#exampleGrid").handsontable("loadData", result);
            })
            .fail(function (r, o) {
                alert("Failed : " + r.responseText);
            });
        });
        </script> 

        <div id="exampleGrid" class="dataTable"></div>
    </form>
</body>

person user2043502    schedule 17.04.2013    source источник
comment
Что показывает ваш браузер, когда вы переходите к http://..../CarsService.svc/GetCars   -  person I4V    schedule 17.04.2013
comment
Он спрашивает меня, хочу ли я сохранить файл. Файл выглядит следующим образом: {d:[{__type:Car:#GridWebApp,Name:Kia,Year:2008},{__type:Car:#GridWebApp,Name:Nissan,Year:2009}]}   -  person user2043502    schedule 18.04.2013
comment
Я забыл добавить, что когда я запускаю приложение, вызывается служба WCF (возможно, поэтому я получил ошибку Stackoverflow).   -  person user2043502    schedule 18.04.2013
comment
Скорее всего, ваш Handsontable ожидает другой json. Я бы также попробовал добавить атрибут BodyStyle = WebMessageBodyStyle.Bare к атрибуту WebGet, но лучше обратитесь к документации по нему.   -  person I4V    schedule 18.04.2013
comment
Если я добавлю это: [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] я получаю сообщение об ошибке: стиль тела «Голый» не поддерживается «WebScriptEnablingBehavior». Измените стиль тела на «WrappedRequest».   -  person user2043502    schedule 18.04.2013
comment
При этом я получаю тот же результат, что и раньше: [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]   -  person user2043502    schedule 18.04.2013


Ответы (2)


У меня работает следующее:

Я использую Json.net от newtonsoft: http://json.codeplex.com/

Договор на обслуживание:

[WebInvoke(Method = "GET")]
[OperationContract]
string GetAllData();

служба wcf возвращает:

return JsonConvert.SerializeObject(data);

и javascript... ("данные" - это то, что возвращается моим вызовом Ajax)

var myData = JSON.parse(data.d);

var config = {
    data: myData,
    columns: [
        //I had to set 'data' of each column
        { data: "OtherParty" },
        { data: "Reference" }
    ]
};

$container.handsontable(config);

Я надеюсь, что это полезно

person PostureOfLearning    schedule 27.06.2013

EncryptionUtils

import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEParameterSpec;
import sun.misc.BASE64Decoder;

public class EncryptionUtils
{
  private Cipher decryptCipher;
  private BASE64Decoder decoder = new BASE64Decoder();

  public EncryptionUtils() throws SecurityException {
    Security.addProvider(new com.sun.crypto.provider.SunJCE());

    char[] pass = "edurixkey".toCharArray();
    byte[] salt = {
      -93, 33, 36, 44, 
      -14, -46, 62, 25 };

    int iterations = 3;

    init(pass, salt, iterations);
  }

  public void init(char[] pass, byte[] salt, int iterations) throws SecurityException {
    try {
      PBEParameterSpec ps = new PBEParameterSpec(salt, 20);
      SecretKeyFactory kf = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
      SecretKey k = kf.generateSecret(new javax.crypto.spec.PBEKeySpec(pass));

      decryptCipher = Cipher.getInstance("PBEWithMD5AndDES/CBC/PKCS5Padding");
      decryptCipher.init(2, k, ps);
    }
    catch (Exception e) {
      throw new SecurityException("Could not initialize Encryption: " + e.getMessage());
    }
  }

  public synchronized String decrypt(String str) throws SecurityException {
    try {
      byte[] dec = decoder.decodeBuffer(str);
      byte[] utf8 = decryptCipher.doFinal(dec);
      return new String(utf8, "UTF8");
    }
    catch (Exception e) {
      throw new SecurityException("Could not decrypt: " + e.getMessage());
    }
  }
}   
person Smit    schedule 12.07.2017