Перейдите в javascript словарь словаря (.NET) - PullRequest
1 голос
/ 05 января 2009

Я пытаюсь решить проблему передачи двумерной таблицы в AJAX-приложение JavaScript через веб-сервисы SOAP. Я пытаюсь передать данные на веб-страницу JavaScript через веб-сервис ASP.NET, объявленный со следующими атрибутами:

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]

Мне нужно, чтобы сложный тип был передан в JavaScript:

[Serializable]
public class PayRateSummary
{
    public string[] EmployeeId;
    public Dictionary<string, string> EmployeeName;
    public string[] PaycodeId;
    public Dictionary<string, Dictionary<string, double?>> EmployeePaycodeRate;
}

[WebMethod(EnableSession = true)]
public DataElements.PayRateSummary EnumPayRates(Guid companyId)
{
}

И веб-сервис объявлен довольно стандартным способом:

    <asp:ScriptManager runat="server" ID="ScriptManager1">
        <Services><asp:ServiceReference Path="~/WebService.asmx" /></Services>
    </asp:ScriptManager>

... function RefreshPayRates () { WebService.EnumPayRates (CompanyCurrent, OnPayRatesLoaded, OnFailure); } * +1010 *

По какой-то причине словарь [строка, строка] проходит нормально, но не словарь [строка, словарь [строка, строка]]:

-> http://vvcap.net/db/8rveoL-FMP6EUikCaqiz.htp

Я помню, как в прошлом бился головой о стену, чтобы понять, что можно сделать, чтобы пройти мимо таких объектов, и никогда не находил никакого решения.

Ответы [ 2 ]

2 голосов
/ 05 января 2009

Опираясь на ответ sktrdie , вы можете использовать ASP.NET AJAX JSON Web Services для передачи и возврата данных в виде объектов JSON. Вот несколько примеров -

В этом вопросе много полезной информации о JSON - Что такое JSON и зачем мне его использовать?

РЕДАКТИРОВАТЬ -

В данный момент вы говорите, что используете SOAP , который является транспортным протоколом на основе XML. Здесь есть очень краткая статья - Расширение существующей веб-службы ASP.NET для поддержки JSON - которая объясняет, как расширить существующую веб-службу

Кроме того, если у вас нет доступа к .NET 3.5 JSON сериализатору / десериализатору, взгляните на библиотеку Джеймса Ньютона Кинга Джеймса Ньютона .

РЕДАКТИРОВАТЬ 2 -

Снова глядя на ваш скриншот и тот факт, что у вас есть атрибут [ScriptService], вы, похоже, возвращаете строку JSON (что, как я понимаю, используется по умолчанию). Поэтому я думаю, что сериализатору ASP.NET AJAX JSON не удалось сериализовать обнуляемый тип double в этой строке

public Dictionary<string, Dictionary<string, double?>> EmployeePaycodeRate;

к правильному типу данных JSON в каждом экземпляре? Вы можете увидеть, так ли это на самом деле, изменив веб-сервис так, чтобы он возвращал значение double, а затем попробуйте выполнить его с данными, имеющими значения.

Согласно MSDN -

Поддерживаемые типы Nullable также поддерживаются и отображаются в JSON таким же образом, что и типы, не допускающие NULL.

Тем не менее, я думаю, что стоит посмотреть аналогично тому, как я предлагал, так как именно здесь возникает ваша проблема

Надеюсь, это поможет

РЕДАКТИРОВАТЬ 3 -

Кажется странным, почему Dictionary со значением Dictionary невозможно представить в виде строки JSON. Учтите, что словарь выглядит так в JSON

[{"Key":"a1","Value":"a1"},
{"Key":"a2","Value":"a2"}]

Таким образом, словарь со значением словаря будет выглядеть так (я считаю)

[{"Key":"a1","Value": {"Key":"b1","Value":"b1"} },
{"Key":"a2","Value": {"Key":"b2","Value":"b2"} }]

, который является действительным JSON согласно JSONLint - валидатор JSON .

2 голосов
/ 05 января 2009

Вы пробовали использовать это: http://code.google.com/p/aspjson/

Я не знаком с ASP, но в PHP я использую нечто подобное для преобразования собственных объектов PHP в объекты JSON.

...