本来不想写这篇文章,可是这个东西竟然搞掉我一天的时间,虽然不是什么技术上的难题,可是毕竟找到了一些注意到的地方。在这其中,从网上找了好久,有一篇《有关AjaxPro在内容页(相对于母板页)注册后,客户端无法调用ajax方法的问题 》对我帮助挺大。如这个题目,我也是要实现的是相对于母板页中,客户端无法识别注册的类的问题。
    项目环境:
    1、创建一个web子项目。
    2、在子项目的web.config里面<system.web>中添加如下代码:
    <httpHandlers>
         <add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory,AjaxPro.2"/>
    </httpHandlers>
    3、定义母板页。在母板页面文件中定义如下javascript函数:
    <script language="javascript">
        function IsSnExist_callback(result)
        {
            var msg = document.getElementById('lblMessage');
            var bun = document.getElementById('btnAdd');
            var value = result.value;
            if( value == '1' )
            {
                msg.innerHTML = '此编号可用!';
                msg.style.color='green';
                bun.disabled=false;
                return false;           
            }           
            else
            {
                msg.innerHTML = '此编号已经存在!';
                msg.style.color='red';  
                bun.disabled=true;
                return false;
            }
        }
        function VerifySn(Code)
        {
            BaseSetting.GetReturnCode(Code, IsSnExist_callback);
        } 
    </script>

    其中,BaseSetting为内容页中的类。lblMessage为内容页中一个lable的ID,btnAdd为内容页中一个button的ID。
    4、定义内容页。如下:
    <%@ Page Language="vb" AutoEventWireup="false" MasterPageFile="/DRPManagement/master/master.Master" CodeBehind="BaseSetting.aspx.vb" Inherits="DRPManagement.BaseSetting"
    title="无标题页" %>
    <%@ MasterType VirtualPath ="/DRPManagement/master/master.Master" %>
    <asp:content  ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
         级别编号:<asp:TextBox ID="txtSn" runat="server" CssClass ="edline" onchange="VerifySn(this.value)"  CausesValidation="True" Width="96px"></asp:TextBox>
                         <asp:Label ID="Message" runat="server" ForeColor="Red"></asp:Label>

    </asp:content>
    5、在内容页的page_load里面注册BaseSetting,如下所示:
     AjaxPro.Utility.RegisterTypeForAjax(GetType(BaseSetting))
    开始的时候总是提示:BaseSetting未定义。
    在网上找到上面的那篇文章后,把上面第三步的function VerifySn(Code)改成如下所示:
     function VerifySn(Code)
        {
            DRPManagement.BaseSetting.GetReturnCode(Code, IsSnExist_callback);
        }  
    但提示DRPManagement未定义,通过查看页面代码,由ajaxPro生成的js引用中与我这里的类和命名空间是一致的,为什么找不到呢,以上所有步骤都是正确的,我单独建了一个项目,按上面的做法,可以成功,于是想到会不会是由于web.config中的配置。由于把子项目中的 
    <httpHandlers>
         <add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory,AjaxPro.2"/>
    </httpHandlers>
拷备到主项目中的web.config中,这次通过跟踪javascript则可以看到上面的DRPManagement.BaseSetting有效了,但是当执行到
    function IsSnExist_callback(result)
        {
            var msg = document.getElementById('lblMessage');
            var bun = document.getElementById('btnAdd');
            var value = result.value;
            if( value == '1' )
            {
                msg.innerHTML = '此编号可用!';
                msg.style.color='green';
                bun.disabled=false;
                return false;           
            }           
            else
            {
                msg.innerHTML = '此编号已经存在!';
                msg.style.color='red';  
                bun.disabled=true;
                return false;
            }
        }
这个函数的时候,则msg这个变量为空,这说明'lblMessage'是无效的标识,大家知道,在最后生成的页面中,有些服务器控件的ID,都被冠以一些前缀来引用,于是查看页面文件,果然'lblMessage'与'btnAdd'控件的ID变成了ctl00_ContentPlaceHolder1_lblMessagectl00_ContentPlaceHolder1_btnAdd,于是把上面的 var msg = document.getElementById('lblMessage');
    var bun = document.getElementById('btnAdd');
改成 var msg = document.getElementById('ctl00_ContentPlaceHolder1_lblMessage');
       var bun = document.getElementById('ctl00_ContentPlaceHolder1_btnAdd');
通过跟踪,代码已经很好的工作了。
注意:
    要进行验证的textbox的属性不能设置AutoPostBack ="true"这一项,否则,在每次执行的时候,都会触发ajaxPro的dispose函数,而使调用失效。

posted on 2008-04-29 17:26  孤枭  阅读(661)  评论(1编辑  收藏  举报