使用javascript从代码隐藏到客户端获取DataTable值

时间:2010-12-09 17:21:48

标签: c# javascript asp.net

我需要帮助才能使用javascript从服务器到客户端获取特定的数据表值。

实施例。 在我的类Countries.aspx.cs中,我在我的代码上的某个地方说在页面加载上。

DataTable dtbCountries = Repository.GetAllCountries;

我的dtbCountries现在包含此记录

ID  Country
1   HongKong
2   Japan
3   Korea

在我的网络表单中,我想使用javascript

获取我的dtbCountries的值
<script type="text/javascript">
   // my code here to get the dtbCountries values
</script>

我该怎么办?或者在客户端暴露我的dtbCountries是最好的做法。

提前致谢!

1 个答案:

答案 0 :(得分:2)

你有一些选择。首先,我假设您需要的是实际数据而不是DataTable对象给出的任何功能,因此您最好创建一个实体(可能是struct)来存储表的数据 - 必须标记Serializable属性。

您的一个选择是封装在页面方法中检索它。这些方法透明地暴露给JavaScript(即,它们具有与后面的代码中相同的语法)。这些方法必须为static,并标有PageMethod属性。

另一种选择是以JSON格式在HTML中“编写”表格内容(用JavaScript表示对象的表示法)。

编辑2 :将内容序列化为JSON的方法是使用类System.Web.Script.Serialization.JavaScriptSerializer,创建实例并调用.Serialize(<your-serializable-object>)

修改:添加了以下(工作)示例...

ASPX 页面:

<script type="text/javascript">// <![CDATA[
    function doTest( ) {
        try {
            PageMethods.test(theForm.qty.value, function( result ) {
                var  str = '';
                for ( var  key in result ) {
                    str += '\t{ '+ key +': '+ result[ key ] +' }\n';
                }
                alert('Page Method returned the following result:\n'+ (str || "{ }"));
            }, function( ex ) {
                alert('Page Method returned the following "'+ ex.get_exceptionType() +'" exception:\n'+ ex.get_message());
            });
        } catch( err ) {
            alert('Failed to execute Page Method:\n'+ err);
        }
    } // void doTest()
// ]]>
</script>
···
<form runat="server" id="form">
  <asp:scriptmanager runat="server" enablepagemethods="true" />

  <fieldset id="forma">
    <legend>WebMethod Test</legend>
    <label for="qty">
      Number of elements (>= 0):
      <input type="text" name="qty" id="qty" value="5" />
    </label>
    <input type="button" value="Push the button!" onclick="doTest(this)" />
  </fieldset>

</form>

并且,在您背后的代码

using System;
using System.Collections.Generic;
using System.Web.Services;

namespace Tests {

    public partial class Test : System.Web.UI.Page {

        [WebMethod]
        static public IDictionary<string,string> test( int length ) {
            if ( 0 > length ) {
                throw  new ArgumentException( "Length cannot be less than zero", "length" );
            }
            var  result = new Dictionary<string,string>( length );
            for ( int  i = 0;  i < length;  i ++ ) {
                result.Add(i.ToString(), Char.ConvertFromUtf32(65 + i) +"|"+ Char.ConvertFromUtf32(97 + i));
            }
            return  result;
        } // IDictionary<string,string> test( int )

    }

}