1

在页面加载时,我有可用的 DataTable 结果,我需要将其传回 javascript 进行处理。

我有哪些选择?

  1. 使用隐藏字段将数据传回。不确定如何准确,可能会将其转换为 xml/json,然后以这种方式从 javascript 访问它。好像很痛。这种方法没有额外的往返行程。
  2. 使用 webmethod/webservice 直接从 javascipt 发出调用,然后取回 DataTable,但是这需要额外的往返,因为我已经在页面加载时提供了 DataTable。
  3. 也可以使用可从 .aspx 页面使用的ASP.NET 内联表达式(即 <% 语法)访问代码中的对象。这种方法没有额外的往返行程。
  4. 将 DataTable 转换为 json/xml,然后使用 ASP 的 ClientScript.RegisterStartupScript 使其在其中作为从函数或其他东西返回的字符串可用。听起来很hacky。
  5. 将 DataTable/DataSet(或任何实现 IEnumerable 接口的对象)绑定到 ASP 数据控件,例如 DataGrid、DataList、Repeater 等……然后通过一些 CSS 隐藏控件:#datacontrol {display: none;}

我怎样才能做到这一点?

4

4 回答 4

0

如果它只是数组,请参考this

如果是自定义对象,IMO 最好通过调用服务器方法。ajax 请求并将它们加载到 javascript 对象中并处理数据。

于 2012-12-13T22:25:25.803 回答
0

正如您已经推理过的那样,您可以通过多种方式来做到这一点。每当我需要这样做时,我都会使用 clientscript.registerclientscriptblock 方法将我的数据写入一个 javascript 变量,然后在页面中使用 javascript 来访问该变量并执行其余的解析。 例如看这个

您只需使用字符串生成器或您选择的任何内容来调暗包含表值的 javascript 数组并将其传递给页面。

于 2012-12-21T00:32:50.777 回答
0

我在我的一个 asp.net 应用程序中有同样的要求。我所做的是,我通过使用自定义分隔符(如 :: ;)从 Page_Load() 上的 DataTable 创建了一个字符串变量。等用于行分隔符和列分隔符。然后使用 CSS {display: none;} 将字符串设置为隐藏字段或文本框文本

之后,您可以在 javascript $(document).ready() 块或 javascript pageLoad function() 中获取隐藏字段或 TextBox 的值,如果您希望在每次完整/部分回发时执行它。

获取值并将其解码,就像您在代码隐藏中将 DataTable 编码到字符串中一样,并根据需要对其进行处理。

希望能帮助到你 :)

于 2012-12-27T11:37:07.053 回答
0

在尝试了上述几个选项之后,我发现#3ASP.NET 内联表达式)是访问 ADO 查询结果(如 DataTable 或 DataSet)的最佳选择,因为它实现最快并且没有额外的回合由于在页面构建期间解决了内联表达式而导致的行程。

我尝试了#5(将数据绑定到数据控件,然后将其隐藏),但速度明显较慢,而且我很难找到可以公开 DataTable/DataSet 的所有功能的控件。您可以将记录绑定到一些数据控件,但我发现在转换为转发器控件等时,DataSet/DataTable 附带的许多“好东西”都会丢失。如果您使用功能更全面的 ASP 控件之一来获取更多这些功能,那么您会失去性能,因为这些控件用于读/写和呈现内容以供显示。访问数据并不像我期望的那样简单,因为它在后面的代码中。

我想到了#4(通过 ASP 的 ClientScript.RegisterStartupScript 传递数据),但不想序列化/反序列化我需要公开和工作的每个对象,尽管它会出现任何问题。这似乎不是正确的方法。我想这对于更简单的对象会很好。

并且#1(将数据序列化到隐藏字段)与上面的#4(通过ASP的ClientScript.RegisterStartupScript传递数据)的概念几乎相同,所以我也没有打扰那个。

另一种(第二好的)可能性是做#2(使用 webmethod/webservice)正如@Sundeep 和@ron_tornambe 所指出的。但是,此选项为页面请求添加了额外的往返行程,并且由于上述方案已准备好在页面加载时使用 DataTable/DataSet,因此对我来说不是最佳选择。如果不是这样,我会说它等于我的第一选择 #3(ASP.NET 内联表达式),因为您将获得完整的功能对象。

于 2012-12-28T18:16:45.953 回答