Получение динамического объекта в PageMethod из Javascript - PullRequest
5 голосов
/ 28 декабря 2011

Я создал new object() в Javascript, поместил в него некоторые значения и передал его PageMethod ...

var filters = new object();

filters.Name = $("#tbxName").val();
filters.Age = parseInt($("#tbxAge").val());

PageMethods.getPeople(filters, getPeopleCallback);

... который в своей подписи получает аргумент dynamic.

[WebMethod]
public static object getPeople(dynamic filters)
{
    ...

Весь код компилируется и запускается без проблем, за исключением PageMethod на стороне сервера, который понимает параметр dynamic как Dictionary.

Когда я отлаживаю код, чтобы увидеть определение объекта filters, он показывает мне следующий тип: filters = {System.Collections.Generic.Dictionary<string,object>}

Итак, единственный способ справиться с этим - использовать его как Dictionary ...

var name = filters["Name"];
var age = filters["Age"] as int?;

.. Но я намеревался использовать его как динамический объект

var name = filters.Name;
var age = filters.Age;

Я знаю, что это совсем не страшно, и у меня нет абсолютно никаких проблем с доступом к нему в качестве словаря (и я также знаю, что могу создать DynamicObject «Прокси» для доступа к словарю, как динамический объект).

Я просто хочу это понять. Итак:

  1. Почему PageMethod понимает его как словарь?
  2. Есть ли способ заставить эту работу работать как Динамический объект (кроме подхода «Прокси»)?

Я надеялся, что это может сработать, потому что я обычно определяю эти Filter классы на стороне сервера и создаю его в Javascript, следуя той же структуре, и PageMethod понимает его и правильно конвертирует, когда я определяю этот тип в качестве аргумента ( например: getPeople(Filters filters)). Итак, мне было интересно, может ли он сделать это также с динамическими объектами (экономя мое время и ненужные классы).

Я ценю ваше время и помощь.

1 Ответ

2 голосов
/ 28 декабря 2011
  1. Причина, по которой метод страницы воспринимает это как словарь, заключается в том, как JavaScriptSerializer работает внутри.Поскольку все объекты JSON могут быть представлены в виде Dictionary<string, object>, первый этап JSS - преобразование строки JSON в словарь (если не зарегистрированы пользовательские преобразователи для целевого типа), и в результате вы получаете этот словарь в качестве конечного результатапреобразование для динамики.

  2. Не легко.

Вы можете поэкспериментировать с написанием собственного JavaScriptConverter для dynamic.Это пример чего-то такого же, что я написал некоторое время назад: https://gist.github.com/6cfcdfdf2a117fa5e81b

Моя настройка поведения сериализации вместо десериализации, но вы можете реализовать свой собственный код в методе десериализации для этого.

...