我在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
“代理”来访问字典像一个动态的对象)。
我只想了解这一点。所以:
我希望这可以工作,因为我通常在服务器端定义那些Filter
类,并在Javascript中按照相同的结构创建它,当我将Type定义为一个时,PageMethod理解它并正确转换它参数(例如:getPeople(Filters filters)
)。所以,我想知道它是否也可以使用动态对象(节省我的时间和不必要的类)。
感谢您的时间和帮助。
答案 0 :(得分:2)
页面方法将其视为字典的原因是JavaScriptSerializer在内部的工作方式。由于所有JSON对象都可以表示为Dictionary<string, object>
,因此JSS的第一步是将JSON字符串转换为字典(如果没有注册目标类型的自定义转换器),最后将该字典作为结尾动态转换的结果。
不容易。
您可以尝试为dynamic
编写自己的JavaScriptConverter。这是我在一段时间内写过的同一个球场中的一个例子:https://gist.github.com/6cfcdfdf2a117fa5e81b
我自定义序列化行为而不是反序列化,但您可以在Deserialize方法中实现自己的代码来执行此操作。