使用JavaScriptConverter实现返回DataTable对象

使用JavaScriptConverter
•复杂类型作为返回值时可能会出现问题
–循环引用
•解决方案
–使用自定义数据类型封装复杂类型
–在web.config里定义Converter

aspx
     < form id = " form1 "  runat = " server " >
        
< asp:ScriptManager ID = " ScriptManager1 "  runat = " server " >
            
< Services >
                
< asp:ServiceReference Path = " DataTableService.asmx "  InlineScript = " true "   />
            
</ Services >
        
</ asp:ScriptManager >
        
        
< input type = " button "  value = " Get DataTable "  onclick = " getDataTable(); "   />
        
        
< div id = " result " ></ div >
        
        
< script language = " javascript "  type = " text/javascript " >
            function getDataTable()
            {
                DataTableService.GetDataTable(onSucceeded, onFailed);
            }
            
            function onSucceeded(result)
            {
                
//  alert(result);
                var sb  =   new  Sys.StringBuilder( " <table border='1'> " );
                sb.append(
" <tr><td>ID</td><td>Text</td></tr> " );
                
for  (var i  =   0 ; i  <  result.rows.length; i ++ )
                {
                    sb.append(
                        String.format(
                            
" <tr><td>{0}</td><td>{1}</td></tr> " ,
                            result.rows[i][
" ID " ],
                            result.rows[i].Text));
                }
                sb.append(
" </table> " );
                
                $
get ( " result " ).innerHTML  =  sb.toString();
            }
            
            function onFailed(error)
            {
                alert(error.get_message());
            }
        
</ script >
    
</ form >

DataTableService.asmx
<% @ WebService Language = " C# "  Class = " DataTableService "   %>

using  System;
using  System.Web;
using  System.Web.Services;
using  System.Web.Services.Protocols;
using  System.Web.Script.Services;
using  System.Data;

[WebService(Namespace 
=   " http://tempuri.org/ " )]
[WebServiceBinding(ConformsTo 
=  WsiProfiles.BasicProfile1_1)]
[ScriptService]
public   class  DataTableService  : System.Web.Services.WebService
{
    [WebMethod]
    
public  DataTable GetDataTable()
    {
        DataTable dt 
=   new  DataTable();
        dt.Columns.Add(
new  DataColumn( " ID " typeof ( int )));
        dt.Columns.Add(
new  DataColumn( " Text " typeof ( string )));

        Random random 
=   new  Random(DateTime.Now.Millisecond);
        
for  ( int  i  =   0 ; i  <   10 ; i ++ )
        {
            dt.Rows.Add(i, random.Next().ToString());
        }

        
return  dt;
    }

}

web.config中的 </system.web>后面加入以下代码,指定要用到的 Converter,这里其中的一个“BoyConverter”是一个自定义的Converter
   < system.web.extensions >
    
< scripting >
      
< webServices >
      
<!--  Uncomment  this  line to customize maxJsonLength and add a custom converter  -->
      
      
< jsonSerialization >
        
< converters >
                    
< add name = " DataSetConverter "  type = " Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, Microsoft.Web.Preview "   />
                    
< add name = " DataRowConverter "  type = " Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter, Microsoft.Web.Preview "   />
                    
< add name = " DataTableConverter "  type = " Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview "   />
                    
< add name = " BoyConverter "  type = " Converter.BoyConverter, App_Code "   />
                
</ converters >
      
</ jsonSerialization >
      
      
<!--  Uncomment  this  line to enable the authentication service. Include requireSSL = " true "   if  appropriate.  -->
      
<!--
        
< authenticationService enabled = " true "  requireSSL  =   " true|false " />
      
-->

      
<!--  Uncomment these lines to enable the profile service. To allow profile properties to be retrieved
           and modified 
in  ASP.NET AJAX applications, you need to add each property name to the readAccessProperties and
           writeAccessProperties attributes. 
-->
      
<!--
      
< profileService enabled = " true "
                      readAccessProperties
= " propertyname1,propertyname2 "
                      writeAccessProperties
= " propertyname1,propertyname2 "   />
      
-->
      
</ webServices >
      
<!--
      
< scriptResourceHandler enableCompression = " true "  enableCaching = " true "   />
      
-->
    
</ scripting >
  
</ system.web.extensions >
最后还要引入 Microsoft.Web.Preview.dll才能正确使用

你可能感兴趣的:(JavaScript)