• dhl:AjaxPro的使用后感


    为了改维 www.pingco.com的联动效果,费了半天劲。使用AjaxPro2.dll 注意点:

    1. web.config 检查是否有:必须有Ajax接管httpHandlers

    <httpHandlers>
         <add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax" />
        </httpHandlers>

     2.在。cs中注册AjaxPro

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

     protected void Page_Load(object sender, EventArgs e)
            {

          AjaxPro.Utility.RegisterTypeForAjax(typeof(_Default)); //注册ajaxPro,括号中的参数是当前的类名

           if (!Page.IsPostBack)
                {
                    //---------------------------------------------------------------------------
                    this.DropDownList1.DataSource = getMobileType();
                    this.DropDownList1.DataTextField = "MobileFactory";
                    this.DropDownList1.DataValueField = "MobileFactory";
                    this.DropDownList1.DataBind();
                    this.DropDownList1.Items.Insert(0, "-请选择手机品牌-");
                    this.DropDownList3.Items.Insert(0, "-请选择手机型号-");
                    this.DropDownList1.Attributes.Add("onchange", "mobileResult();");

    }

    }

    /// <summary>
            /// 获取手机类型
            /// </summary>
            /// <returns></returns>
            public static DataTable getMobileType()
            {
                webcode.Data.SqlConn conn = new webcode.Data.SqlConn(System.Configuration.ConfigurationManager.AppSettings["ConnStr_Mobile"].ToString());
                string cmdText = "select distinct(MobileFactory) from T***";
                DataTable dt = conn.getDateTable(cmdText);
                return dt;
            }
            /// <summary>
            /// 获取手机型号
            /// </summary>
            /// <returns></returns>
            //[Ajax.AjaxMethod(Ajax.HttpSessionStateRequirement.Read)]//todo: 测试用
            [AjaxPro.AjaxMethod]
            public DataTable getMobileTypeNumber1(string MobileFactory)
            {
                string cmdText = "select distinct(MobileType) as MobileType, max(WapVersion) as WapVersion from T***  with(nolock) where MobileFactory='" + MobileFactory + "' group by MobileType order by MobileType desc";
                webcode.Data.SqlConn conn = new webcode.Data.SqlConn(System.Configuration.ConfigurationManager.AppSettings["ConnStr_Mobile"].ToString());

                DataTable dt = conn.getDateTable(cmdText);
                return dt;
            }

    }

    3.前台html代码:

    <script language="javascript">            
                function mobileResult()
                {            
                    var m=document.getElementById("DropDownList1");               
                    PingCoWeb._Default.getMobileTypeNumber1(m.value,mobileResult_callback);
                }
               
                function mobileResult_callback(response)
                {
                    if (response.value != null)
                    { 
                        document.getElementById("DropDownList3").length=0;               
                    var ds = response.value;
                        if(ds != null && typeof(ds) == "object" && ds != null)
                        {                   
                            for(var i=0; i<ds.Rows.length; i++)
                        {
                            var name=ds.Rows[i].MobileType;
                          var id=ds.Rows[i].WapVersion;
                          document.all("DropDownList3").options.add(new Option(name,id));
                        }
                        }
                    } 
                    return
                }          
    </script>

    在此一定要注意:PingCoWeb._Default.getMobileTypeNumber1(m.value,mobileResult_callback);
    不能写成:_Default.getMobileTypeNumber1(m.value,mobileResult_callback);

    否则会报js错误:"_Default” 未定义。 因为

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="PingCoWeb._Default"
        EnableEventValidation="false" %>

    如果在类文件中定义getMobileTypeNumber1()函数,js中也要写上完整的类(加上命名空间。)

    比如写到:PingCo.Origin.Web.Helper.AdvertiseDownLoad 下:

    Code

    cs中注册为:

    AjaxPro.Utility.RegisterTypeForAjax(typeof(AdvertiseDownLoad)); //注册ajaxPro,括号中的参数是当前的类名

    js中就的写:PingCo.Origin.Web.Helper.AdvertiseDownLoad.getMobileTypeNumber1(m.value,mobileResult_callback);

    【附录】

    :【AjaxPro实现机制浅析一】AjaxPro内部为我们做什么工作?
    正文:

    先找个借口:好早就想分析下AjaxPro的代码实现机制了,一直苦于没时间,现在嘛总算有那么丁点了,开篇了,慢慢分析……

    以一个最简单的例子开始:
    点击一个客户端button,触发一个javascript函数,执行一个只有一个string参数的服务端方法,返回一个处理过的string,处理方法是将传入的string变成“Hi”+string +“!”;够简单了,为了是不希望罗嗦的代码影响简单的分析;
    所有代码如下:
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>

    <!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 type="text/javascript">
        
        function doTest()
        {
            AJAXDemo.Examples.Test.TestMethod.GetTest("AjaxPro",doTest_callback);
        }

        function doTest_callback(res) {
            alert(res.value);
        }
       
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <input id="Button1" type="button" onclick="doTest()" value="测试"/></div>
        </form>
    </body>
    </html>
    Test.aspx.cs
    public partial class Test : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Utility.RegisterTypeForAjax(typeof(AJAXDemo.Examples.Test.TestMethod));
        }
    }
    AJAXDemo.Examples.Test
    using System;
    using AjaxPro;

    namespace AJAXDemo.Examples.Test
    {
        public class TestMethod
        {
            public TestMethod()
            {}

            [AjaxMethod]
            public string GetTest(string testText)
            {
                return "Hi," + testText + "!";
            }
        }
    }
    1.首先我们看AjaxPro在页面上给我们生成了什么?
    Test[1]
    <!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><title>
        无标题页
    </title>
        <script type="text/javascript">
        
        function doTest()
        {
            AJAXDemo.Examples.Test.TestMethod.GetTest("AjaxPro",doTest_callback);
        }

        function doTest_callback(res) {
            alert(res.value);
        }
       
        </script>
    </head>
    <body>
        <form name="form1" method="post" action="Test.aspx" id="form1">
    <div>
    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNzgzNDMwNTMzZGRFekXifzWDNb+qFWPbJumdlZh/dQ==" />
    </div>

    <script type="text/javascript" src="/AJAXDemo.2/ajaxpro/prototype.ashx"></script>
    <script type="text/javascript" src="/AJAXDemo.2/ajaxpro/core.ashx"></script>
    <script type="text/javascript" src="/AJAXDemo.2/ajaxpro/converter.ashx"></script>
    <script type="text/javascript" src="/AJAXDemo.2/ajaxpro/AJAXDemo.Examples.Test.TestMethod,App_Code.un7rskvh.ashx"></script>

        <div>
            <input id="Button1" type="button" onclick="doTest()" value="测试"/></div>
        </form>
    </body>
    </html>
    一定要注意这几行
    <script type="text/javascript" src="/AJAXDemo.2/ajaxpro/prototype.ashx"></script>
    <script type="text/javascript" src="/AJAXDemo.2/ajaxpro/core.ashx"></script>
    <script type="text/javascript" src="/AJAXDemo.2/ajaxpro/converter.ashx"></script>
    <script type="text/javascript" src="/AJAXDemo.2/ajaxpro/AJAXDemo.Examples.Test.TestMethod,App_Code.urx4hqkg.ashx"></script>
    通过使用http://localhost:3578/AJAXDemo.2/ajaxpro/prototype.ashx和http://localhost:3578/AJAXDemo.2/ajaxpro/core.ashx不难发现,其中前面两个是源代码中带的两个js文件(core.js和prototype.js)转化出来的,基本内容也跟原来的文件一样,而converter.ashx和AJAXDemo.Examples.Test.TestMethod,App_Code.urx4hqkg.ashx里面有什么呢?看下面:
    AJAXDemo.Examples.Test.TestMethod,App_Code.urx4hqkg.ashx
    addNamespace("AJAXDemo.Examples.Test");
    AJAXDemo.Examples.Test.TestMethod_class = Class.create();
    AJAXDemo.Examples.Test.TestMethod_class.prototype = (new AjaxPro.AjaxClass()).extend({
        GetTest: function(testText) {
            return this.invoke("GetTest", {"testText":testText}, this.GetTest.getArguments().slice(1));
        },
        initialize: function() {
            this.url = '/AJAXDemo.2/ajaxpro/AJAXDemo.Examples.Test.TestMethod,App_Code.un7rskvh.ashx';
        }
    });
    AJAXDemo.Examples.Test.TestMethod = new AJAXDemo.Examples.Test.TestMethod_class();
    converter.ashx 
     

    addNamespace("Ajax.Web");

    Ajax.Web.NameValueCollection = function()
    {
        this.__type = "System.Collections.Specialized.NameValueCollection";

        this.add = function(key, value) {
            if(this[key] == null) {
                this[key] = value;
            }
        }
       
        this.getKeys = function() {
            var keys = [];
           
            for(key in this)
                if(typeof this[key] != "function")
                    keys.push(key);
               
            return keys;
        }
       
        this.getValue = function(key) {
            return this[key];
        }
       
        this.toJSON = function() {
            var o = this;
            o.toJSON = null;
            delete o.toJSON;
            return AjaxPro.toJSON(o);
        }
    }

     


    addNamespace("Ajax.Web");

    Ajax.Web.DataTable = function(columns, rows) {

        this.__type = "System.Data.DataTable, System.Data";
        this.Columns = new Array();
        this.Rows = new Array();

        this.addColumn = function(name, type) {
            var c = new Object();
            c.Name = name;
            c.__type = type;
           
            this.Columns.push(c);
        }

        this.toJSON = function() {
            var dt = new Object();

            dt.Columns = [];
            for(var i=0; i<this.Columns.length; i++)
                dt.Columns.push([this.Columns[i].Name, this.Columns[i].__type]);

            dt.Rows = [];
            for(var i=0; i<this.Rows.length; i++) {
                var row = [];
                for(var j=0; j<this.Columns.length; j++)
                    row.push(this.Rows[i][this.Columns[j].Name]);
                dt.Rows.push(row);
            }

            return AjaxPro.toJSON(dt);
        }

        this.addRow = function(row) {
            this.Rows.push(row);
        }

        if(columns != null) {
            for(var i=0; i<columns.length; i++) {
                this.addColumn(columns[i][0], columns[i][1]);
            }
        }

        if(rows != null) {
            for(var i=0; i<rows.length; i++) {
                var row = new Object();
                for(var c=0; c<this.Columns.length && c<rows[i].length; c++) {
                    row[this.Columns[c].Name] = rows[i][c];
                }
                this.addRow(row);
            }
        }
    }


    addNamespace("Ajax.Web");

    Ajax.Web.DataSet = function(tables) {
        this.__type = "System.Data.DataSet, System.Data";
        this.Tables = new Array();

        this.addTable = function(table) {
            this.Tables.push(table);
        }

        if(tables != null) {
            for(var i=0; i<tables.length; i++) {
                this.addTable(tables[i]);
            }
        }
    }

    function Person(id) {
        this.FirstName = "";
        this.FamilyName = "";
        this.Age = 0;
        this.ID = id;
        this.__type = 'AJAXDemo.Examples.Classes.Person, App_Code.un7rskvh, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null';
    }

    Person.prototype.get_FullName = function() {
        return this.FirstName + " " + this.FamilyName;
    }

    Person.prototype.toJSON = function() {
        var o = new Object();

        o.firstName = this.FirstName;
        o.familyName = this.FamilyName;
        o.age = this.Age;
        o.id = this.ID;

        return AjaxPro.toJSON(o);
    }

    Person.prototype.save = function() {
        return Person.save(this);
    }

    Person.save = function(p) {
        var ps = new PersonSaver();
        return ps.savePerson(p);    // synchronous call
    }

    var PersonSaver = Class.create();
    PersonSaver.prototype = (new AjaxPro.Request()).extend({
        savePerson: function(p) {
            return this.invoke("SavePerson", {"p":p}).value;
        },
        initialize: function() {
            this.url = "ajaxpro/AJAXDemo.Examples.Classes.Person, App_Code.un7rskvh, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null.ashx";
        }
    })

    正因为是有了上面四个ashx文件我们的
    function doTest()
    {
        AJAXDemo.Examples.Test.TestMethod.GetTest("AjaxPro",doTest_callback);
    }
    才得以异步执行,这些ashx文件又是怎么生成到页面上的,那得归功于web.config的相关配置和下面这句代码:
    Utility.RegisterTypeForAjax(typeof(AJAXDemo.Examples.Test.TestMethod));

    至于Utility.RegisterTypeForAjax方法产生的一序列动作我将在后文中继续说明,有兴趣的可以自己跟踪下这些代码的执行。

     

  • 相关阅读:
    webdriver 窗口切换
    element not visible 错误的原因和解决方式
    选择子数据,默认存储父数据 的校验方法
    What's jenkins And How to Install
    testng suite
    webdriver 选择下拉列表的操作
    webdriver 获取表格内的文案
    webdriver 定位表格元素
    webdriver 上传文件
    树上倍增求解LCA 模板
  • 原文地址:https://www.cnblogs.com/dudu837/p/1454865.html
Copyright © 2020-2023  润新知