我依照http://msdn.microsoft.com/zh-cn/magazine/cc546561.aspx里面的方法,用MarkUpBuilder类做了一个独立刷新的页面,例子中用XML数据岛<xml id = item ><tr><td></td><td></td></tr></xml>这样比较好绑定数据,但是现在,我的table样式有特殊的要求,它的部分TD里面是要每秒刷新的数据,另一些是一些user控件,请问这样如何将数据绑定到客户端的table中,谢谢!

解决方案 »

  1.   

    把需要刷新的TD放Updatapanel里面?
      

  2.   

    可是BOSS要求用MarkUpBuilder类呀,调用JS文件,说是这样数据传输量少些。
    BOSS是个老外,很BT的。
      

  3.   

    我用UpDataPanel做了,虽然功能是出来了,但效果明显比较差,刷新延迟
      

  4.   

    每秒刷新...好恐怖的哦,兄弟考虑数据传输量.
    如果指的
    IE->IIS->IE
    使用POST方式访问WebService 数据传输量最小
    将所有需要准备的数据一次返回的,这样数据量也最小.
    当然了,你可以自定义访问 WebService的js
    也非常之简单
    今天上午写的点东西,你可以看一下了解一下
    jscript.js中的内容
    //定义请求数据
    var webServiceUrl = "/Reporter/WebService.asmx";
    //uri 命名空间
    var webServiceUri = "http://tempuri.org/";
    //方法名
    var methodGetAllType = "GetAllTypes";
    //soap的访问方式可以参照  WebService.asmx 页面下的提示,拷贝过来替换相应的值
    //soap 访问的时候参数调用方式
    var methodGetAllTypeSoapContent = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  <soap:Body>    <GetAllTypes xmlns="http://tempuri.org/" />  </soap:Body></soap:Envelope>';//定义访问类
    function CreateXmlHttp() {
        this.XMLHTTP = window.attachEvent ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest();
        this.Method = "POST";
        this.URL = webServiceUrl;
        this.URI = webServiceUri;
        this.MethodName = methodGetAllType;
        this.MethodSoapContent = methodGetAllTypeSoapContent;
        this.Headers = null;
        this.OnPostBack = null;
        this.Send = function() {
            if (this.XMLHTTP == null) {
                alert("浏览器不支持动态创建异步XMLHTTP对像");
                return;
            };
            var tempObject = this;
            this.XMLHTTP.onreadystatechange = function() {
            if (typeof (tempObject.OnPostBack) == "function") {
                tempObject.OnPostBack(tempObject.XMLHTTP);
                }
            }
            this.XMLHTTP.open(this.Method, this.URL, true);
            this.XMLHTTP.setRequestHeader("SOAPAction", this.URI + this.MethodName);
            this.XMLHTTP.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
            this.XMLHTTP.send(this.MethodSoapContent);
       };
    };下面是页面中的调用<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>    <script src="js/JScript.js" type="text/javascript"></script>
        <script language="javascript">        function InitTypes(context) {
                if (context.readyState == 4) {
                    var result = context.responseXML.getElementsByTagName("soap:Body")[0].text;
                    var array = result.split(";")
                    var container = document.getElementById("cardtype");
                    for (var i = 0; i < array.length; i++) {
                        var oOption = document.createElement("OPTION");
                        oOption.text = array[i];
                        oOption.value = array[i];
                        container.add(oOption);
                    }
                    
                }
            }
            var types = new CreateXmlHttp();
            types.OnPostBack = InitTypes;
            types.Send();
            
        </script></head>
    <body>    <div>   
            <select id="cardtype" onchange="typechanges(this)">
                
            </select>
        </div></body>
    </html>
    下面是WebService.asmx中的内容
    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.Services;
    using Reporter;
    using System.Data.SqlClient;
    using System.Text;/// <summary>
    ///WebService 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class WebService : System.Web.Services.WebService {    public WebService () {        //如果使用设计的组件,请取消注释以下行 
            //InitializeComponent(); 
        }    [WebMethod]
        public string GetAllTypes() {        SqlConnection sqlCon = new SqlConnection(Config.ConnectionString);
            SqlCommand sqlCmd = sqlCon.CreateCommand();
            sqlCmd.CommandText = " select [name] from sysobjects  where xtype = 'U' and right(name,6) <> '_items' ";
            sqlCon.Open();
            SqlDataReader dr = sqlCmd.ExecuteReader();
            StringBuilder sb = new StringBuilder(1024);
            while (dr.Read())
            {
                sb.Append(dr.GetString(0).TrimEnd());
                sb.Append(";");
            }
            dr.Close();
            sqlCon.Close();
            return sb.ToString().TrimEnd(new char[] { ';' });
        }
    }
      

  5.   

    非常重要的Soap调时,参数与返回值的XML格式可以参照webservice.asmx中相应的soap版本
    如下所示SOAP 1.1
    以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。POST /Reporter/WebService.asmx HTTP/1.1
    Host: localhost
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/GetAllTypes"  <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <GetAllTypes xmlns="http://tempuri.org/" />
      </soap:Body>
    </soap:Envelope>
    HTTP/1.1 200 OK
    Content-Type: text/xml; charset=utf-8
    Content-Length: length<?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <GetAllTypesResponse xmlns="http://tempuri.org/">
          <GetAllTypesResult>string</GetAllTypesResult>
        </GetAllTypesResponse>
      </soap:Body>
    </soap:Envelope>
    其中 jscript.js中URL 对应  /Reporter/WebService.asmx this.XMLHTTP.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    对应
    Content-Type: text/xml; charset=utf-8this.XMLHTTP.setRequestHeader("SOAPAction", this.URI + this.MethodName);
    对应
    SOAPAction: "http://tempuri.org/GetAllTypes"  
    methodGetAllTypeSoapContent 
    对应
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <GetAllTypes xmlns="http://tempuri.org/" />
      </soap:Body>
    </soap:Envelope>
    页面中返回值对应Response,我就不写了
      

  6.   

    感谢zyug的热情支持,我看了好久还是没有弄明白你的代码,不过很感谢。由于我这里要求是用WCF做的,服务类都已经写好了的,现在
    就是客户端数据不能合理显示呀,因为MarkupBuilder类里面的_generat方法得重写,可是我现在都想不出有什么更好的实现方法,MarkupBuilder.js是这样写的:
    // 
    // Jadi.MarkupBuilder 
    //Type.registerNamespace('Jadi');
    // Class ctor
    // This code gets called when you instantiate this class
    Jadi.MarkupBuilder = function Jadi$MarkupBuilder() 
    {
        // Calls the base ctor, if any
        Jadi.MarkupBuilder.initializeBase(this);
        
        // Initializes the private members
        this._header = "";
        this._footer = "";
        this._itemTemplate = "";
    }
    Jadi.MarkupBuilder = function Jadi$MarkupBuilder(header, footer) 
    {
        // Calls the base ctor, if any
        Jadi.MarkupBuilder.initializeBase(this);
        
        // Initializes the private members
        this._header = header;
        this._footer = footer;
        this._itemTemplate = "";
    }// PROPERTY:: header: string 
    function Jadi$MarkupBuilder$get_header() { 
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._header;
    }
    function Jadi$MarkupBuilder$set_header(value) {
        var e = Function._validateParams(arguments, [{name: 'value', type: String}]);
        if (e) throw e;    this._header = value;
    }// PROPERTY:: footer: string 
    function Jadi$MarkupBuilder$get_footer() { 
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._footer;
    }
    function Jadi$MarkupBuilder$set_footer(value) {
        var e = Function._validateParams(arguments, [{name: 'value', type: String}]);
        if (e) throw e;    this._footer = value;
    }// PROPERTY:: itemTemplate: string 
    function Jadi$MarkupBuilder$get_itemTemplate() { 
        if (arguments.length !== 0) throw Error.parameterCount();
        return this._itemTemplate;
    }
    function Jadi$MarkupBuilder$set_itemTemplate(value) {
        var e = Function._validateParams(arguments, [{name: 'value', type: String}]);
        if (e) throw e;    this._itemTemplate = value;
    }
    // METHOD:: bind()
    function Jadi$MarkupBuilder$bind(data, callback) {
       var temp = this._generate(data, callback);
       return temp;
    }// METHOD:: loadHeader()
    function Jadi$MarkupBuilder$loadHeader(domElement) {
       var temp = domElement.innerHTML;
       this._header = temp;
    }// METHOD:: loadFooter()
    function Jadi$MarkupBuilder$loadFooter(domElement) {
       var temp = domElement.innerHTML;
       this._footer = temp;
    }// METHOD:: loadItemTemplate()
    function Jadi$MarkupBuilder$loadItemTemplate(domElement) {
       var temp = domElement.innerHTML;
       this._itemTemplate = temp;
    }///////                     ///////
    ///////  PRIVATE members    ///////
    ///////                     ///////function Jadi$MarkupBuilder$_generate(data, itemCallback) 
    {
        var pattern = /#\w+/g;  // Finds all #word occurrences     var _builder = new Sys.StringBuilder(this._header);
        
        for(i=0; i<data.length; i++)
        {
            var dataItem = data[i];
            var template = this._itemTemplate;        var matches = template.match(pattern); 
            for (j=0; j<matches.length; j++)
            {
                var text = matches[j];
                var memberName = text.slice(1);
                
                // Invoke a callback to further modify the data to be bound
                var memberData = dataItem[memberName];
                var temp = memberData;
                if (itemCallback !== undefined)
                {
                    temp = itemCallback(memberName, dataItem);
                }
                    
                template = template.replace(matches[j], temp); 
            }
            
            _builder.append(template);
        }
        
        _builder.append(this._footer);
        
        
        // Return the up
        var up = _builder.toString();
        return up;
    }/*function Jadi$MarkupBuilder$loadItems(domElement[] , Sys.StringBuilder _builder) {
    for(int i =0;i<docElement.length;i++)
       var temp = domElement[i].innerHTML;
       
       this._footer = temp;
    }
    */// Class PROTOTYPE
    Jadi.MarkupBuilder.prototype = 
    {
        get_header:         Jadi$MarkupBuilder$get_header,
        set_header:         Jadi$MarkupBuilder$set_header,
        get_footer:         Jadi$MarkupBuilder$get_footer,
        set_footer:         Jadi$MarkupBuilder$set_footer,
        get_itemTemplate:   Jadi$MarkupBuilder$get_itemTemplate,
        set_itemTemplate:   Jadi$MarkupBuilder$set_itemTemplate,
        bind:               Jadi$MarkupBuilder$bind,
        _generate:          Jadi$MarkupBuilder$_generate,
        loadHeader:         Jadi$MarkupBuilder$loadHeader,
        loadFooter:         Jadi$MarkupBuilder$loadFooter,
        loadItemTemplate:   Jadi$MarkupBuilder$loadItemTemplate
    }Jadi.MarkupBuilder.registerClass('Jadi.MarkupBuilder');