zoukankan      html  css  js  c++  java
  • AjaxPro实现无刷新更新数据

    使用AjaxPro实现无刷新更新数据

    需求

    在一个页面动态无刷新的更新后台得到的数据。要想无刷新的更新数据,需要使用Javascript能够获取后台返回的数据,然后通过第三方Javascript库(JQuery等)动态更新web页面DOM对应的数值即可,而AjaxPro库恰恰具有使用Javascript语句获取后台方法返回的数据的功能,问题就这样迎刃而解,顿时感觉萌萌哒。

    流程

    整个过程如下图所示:

    image

    详细操作

    首先下载AjaxPro库(点击此处下载AjaxPro库),下载后解压得到两个dll文件,如下所示:

    image

    其中AjaxPro.2.dll库是AjaxPro.dll库的升级版本,我们以最新版本AjaxPro.2.dll为例来一步步说明AjaxPro的使用。

    接下来创建一个空的Web项目,添加AjaxPro.2.dll引用,新建一个Aspx页面命名为AjaxPro2Test,添加jQuery库和样式文件,项目文件结构如下所示:(请无视其它的文件,这个跟我后台取的数据有关)

    image

    打开Web.config配置文件,在web下添加httpHandlers节点,如下所示:

    复制代码
    <?xml version="1.0"?>
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.0"/>
        <httpRuntime/>
        <httpHandlers>
          <add verb="*" path="*.ashx" type="AjaxPro.AjaxHandlerFactory,AjaxPro.2"/>
        </httpHandlers>
      </system.web>
    </configuration>
    复制代码

    在AjaxPro2Test页面后台即AjaxPro2Test.aspx.cs文件中的Page_Load方法添加AjaxPro对AjaxPro2Test页面类的注册,为js需要调用的后台方法添加[AjaxPro.AjaxMethod]属性(此方法必须声明为public,否则会提示找不到),可以在页面类前面添加[AjaxPro.AjaxNamespace("AjaxTest")]属性(这样js调用时可以直接使用AjaxTest.方法(参数).value,否则需要使用命名空间.页面类.方法名(参数).value),页面后台代码如下所示:

    using System;
    
    using System.Linq;
    
    using Newtonsoft.Json;
    
    using Newtonsoft.Json.Linq;
    
    using PILib;
    
    
    
    namespace PiSdkAjaxPro2Test
    
    {   [AjaxPro.AjaxNamespace("AjaxTest")]
    
        public partial class AjaxPro2Test : System.Web.UI.Page
    
        {
    
            private OSIPISDK _pisdk = new OSIPISDK("piserver", "pidemo", "");
    
            protected void Page_Load(object sender, EventArgs e)
    
            {
    
                AjaxPro.Utility.RegisterTypeForAjax(typeof (AjaxPro2Test));
    
            }
    
        /// <summary>
    
        /// 获取实时数据
    
        /// </summary>
    
        /// <param name="tagName"></param>
    
        /// <returns></returns>
    
        [AjaxPro.AjaxMethod]
    
        public double[] GetRealValByTagName(string tagName)
    
        {
    
            var jTagsArray = (JArray)JsonConvert.DeserializeObject(tagName);
    
    
    
            var tagsNameList = jTagsArray.Select(x => x.ToString()).ToList();
    
    
    
            if (!_pisdk.Connected)
    
            {
    
                _pisdk.ConnectToServer();
    
            }
    
            double[] val;
    
            _pisdk.GetRealData(tagsNameList.ToArray(), out val);
    
            return val;
    
        }
    
        }
    
    }

    AjaxPro2Test页面前台代码如下所示,js代码部分有注释说明:

    复制代码
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AjaxPro2Test.aspx.cs" Inherits="PiSdkAjaxPro2Test.AjaxPro2Test" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
        <script src="jquery-1.8.3.min.js"></script>
        <link href="AjaxTest.css" rel="stylesheet" />
        <script type="text/javascript">
            var tags = new Array();
            var tagsObj = new Array();
            $(document).ready(function () {
                //遍历class为ai的元素,取得元素tagName数组和对应元素数组
                $(".ai").each(function (i) {
                    var tag = $(this);
                    var t = tag.attr("tag");
                    if (t) {
                        tags[i] = t;
                        tagsObj[i] = { Obj: tag };
                    }
                });
                UpdateImpData();
                //每隔3秒更新一下数据
                window.setInterval("UpdateImpData()", 3000);
            });
            //获取后台数据
            function UpdateImpData() {
                //得到后台返回的数据
                var result = AjaxTest.GetRealValByTagName(tags).value;
                if (!result) return;
                //更新DOM对应的Text值
                for (var i = 0; i < result.length; i++) {
                    var obj = tagsObj[i];
                    var xx = obj.Obj;
                    xx.text(result[i].toFixed(2));
                }
            }
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <table>
                <tr>
                    <td class="CheckedTD">有功功率</td>
                    <td class="rtdb ai" tag="1DCS_AI_SELMW" id="testTag"></td>
                </tr>
                <tr>
                    <td class="CheckedTD">汽轮机转速</td>
                    <td class="rtdb ai" tag="1DCS_AI_DEHTOCCS"></td>
                </tr>
                <tr>
                    <td class="CheckedTD">主汽温度</td>
                    <td class="rtdb ai" tag="1DCS_AI_LBA20CT601"></td>
                </tr>
                <tr>
                    <td class="CheckedTD">主汽压力</td>
                    <td class="rtdb ai" tag="1DCS_AI_LBA20CP101"></td>
                </tr>
                <tr>
                    <td class="CheckedTD">再热温度</td>
                    <td class="rtdb ai" tag="1DCS_AI_LBB20CT601"></td>
                </tr>
                <tr>
                    <td class="CheckedTD">再热压力</td>
                    <td class="rtdb ai" tag="1DCS_AI_LBB20CP101"></td>
                </tr>
                <tr>
                    <td class="CheckedTD">总煤量</td>
                    <td class="rtdb ai" tag="1DCS_AI_COALSUM"></td>
                </tr>
                <tr>
                    <td class="CheckedTD">总风量</td>
                    <td class="rtdb ai" tag="1DCS_AI_TOTAIRFLOW"></td>
                </tr>
                <tr>
                    <td class="CheckedTD">真空</td>
                    <td class="rtdb ai" tag="1DCS_AI_MAG10CP102"></td>
                </tr>
            </table>
        </div>
        </form>
    </body>
    </html>
    复制代码

    特别说明

    就是页面前台代码js代码“var result = AjaxTest.GetRealValByTagName(tags).value;”中的AjaxTest对应后台cs文件中[AjaxPro.AjaxNamespace("AjaxTest")]属性中设置的AjaxTest。

    使用AjaxPro.dll库和AjaxPro.2.dll库不同的地方在于Web.config文件配置的不同,使用AjaxPro.dll库的配置文件如下所示:

    复制代码
    <?xml version="1.0"?>
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.0"/>
        <httpHandlers>
          <add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro"/>
        </httpHandlers>
        <httpRuntime/>
      </system.web>
    </configuration>
    复制代码

    最终效果

    image

     
     
    分类: C#
  • 相关阅读:
    数据结构化与保存
    使用正则表达式,取得点击次数,函数抽离
    爬取校园新闻首页的新闻
    网络爬虫基础练习
    词频统计
    试题----编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个
    试题---求出现重现次数最多的字母,如有多个重复的则都求出来
    试题----为什么Java的string类要设成immutable(不可变的)
    面试题---题目
    复制文件夹中所有内容到指定位置
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3929150.html
Copyright © 2011-2022 走看看