本來不想寫這篇文章,可是這個東西竟然搞掉我一天的時間,雖然不是什麼技術上的難題,可是畢竟找到了一些注意到的地方。在這其中,從網上找了好久,有一篇《>有關AjaxPro在內容頁(相對於母板頁)注冊後,客戶端無法調用AJax方法的問題 》對我幫助挺大。如這個題目,我也是要實現的是相對於母板頁中,客戶端無法識別注冊的類的問題。
項目環境:
1、創建一個web子項目。
2、在子項目的web.config裡面
中添加如下代碼:
3、定義母板頁。在母板頁面文件中定義如下Javascript函數:
其中,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" %>
級別編號:
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中的配置。由於把子項目中的
拷備到主項目中的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函數,而使調用失效。