从 Javascript 接收 PageMethod 中的动态对象

本文关键字:动态 对象 PageMethod Javascript 接收 | 更新日期: 2023-09-27 18:18:50

我在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. 有没有办法将其作为动态对象工作("代理"方法除外(?

我希望这可以工作,因为我通常在服务器端定义那些Filter类,并按照相同的结构在 Javascript 中创建它,并且当我将该类型定义为参数时,PageMethod 可以理解它并正确转换它(例如:getPeople(Filters filters)(。所以,我想知道它是否也可以用动态对象做到这一点(节省我的时间和不必要的课程(。

感谢您的时间和帮助。

从 Javascript 接收 PageMethod 中的动态对象

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

  2. 不容易。

您可以尝试为dynamic编写自己的JavaScriptConverter。这是我不久前写的同一个球场的一个例子:https://gist.github.com/6cfcdfdf2a117fa5e81b

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