本来不想写这篇文章,可是这个东西竟然搞掉我一天的时间,虽然不是什么技术上的难题,可是毕竟找到了一些注意到的地方。在这其中,从网上找了好久,有一篇《有关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_lblMessage和ctl00_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函数,而使调用失效。
项目环境:
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_lblMessage和ctl00_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函数,而使调用失效。