从Javascript接收PageMethod中的动态对象

时间:2011-12-27 21:00:02

标签: c# javascript asp.net dynamic pagemethods

我在Javascript中创建了一个new object(),将一些值放入其中并将其传递给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. 有没有办法让这个工作作为动态对象(“代理”方法除外)?
  3. 我希望这可以工作,因为我通常在服务器端定义那些Filter类,并在Javascript中按照相同的结构创建它,当我将Type定义为一个时,PageMethod理解它并正确转换它参数(例如:getPeople(Filters filters))。所以,我想知道它是否也可以使用动态对象(节省我的时间和不必要的类)。

    感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:2)

  1. 页面方法将其视为字典的原因是JavaScriptSerializer在内部的工作方式。由于所有JSON对象都可以表示为Dictionary<string, object>,因此JSS的第一步是将JSON字符串转换为字典(如果没有注册目标类型的自定义转换器),最后将该字典作为结尾动态转换的结果。

  2. 不容易。

  3. 您可以尝试为dynamic编写自己的JavaScriptConverter。这是我在一段时间内写过的同一个球场中的一个例子:https://gist.github.com/6cfcdfdf2a117fa5e81b

    我自定义序列化行为而不是反序列化,但您可以在Deserialize方法中实现自己的代码来执行此操作。