這幾天把項目中用到的ajaxpro方法學習總結了一下,也參考了網上的一些資料
一、簡介
ajax(asynchronose javascript+xml)應用可以僅向伺服器發送並取回必需的資料,它使的
SOAP或其他基於XML的web service介面,並在用戶端採用javascript處理來自伺服器的響應。
因為在伺服器和瀏覽器之間交找的資料大量減少,結果我們就能看到響應更快的應用。同時處理工作可以發出請求的用戶端機器上完成,所以web伺服器的處理時間也減少了。
Ajax應用程式的優勢在於:
1通過非同步模式,提升了使用者體驗
2最佳化了瀏覽器和伺服器之間的傳輸,減少了不必要的資料往返,減少了頻寬的佔用
3Ajax引擎在用戶端運行,承擔了一部分本來由伺服器承擔的工作,從而減少了大使用者量下的伺服器負載
二、配置
Ajax.net有AjaxPro.dll和Ajax.dll兩個版本,這兩個版本在使用上雖然差不多,但還是有區別的,主要的區別如下:
web.config設定檔不一樣
(1)web.config設定檔不一樣
ajax.dll的設定檔的寫法為
<add verb="post,get" path="ajax/*.ashx" type="ajax.pagehanderfactory,ajax"/>
ajaxpro.dll的醋置檔案寫法為
<add verb="*" path='ajaxpro/*.ashx" type="ajaxpro.ajaxhanderfactory,ajaxpro"/>
(2)調用伺服器方法的時候方式 不一樣,很多朋友就是因為這個原因,發現命名空間找不到或者對象未定義
調用ajax.dll的時候調用伺服器方法不要加命名空間
應用ajaxpro.dll的時候,調用伺服器方法需要加命名空間
ajax.dll為
var response=Web.GetServermethod();
alert(response.value);
ajaxpro.dll為
var response=web.test.getserverMethod();
alert(response.value);
三、使用步驟
1,首先下載ajaxpro組件。並將ajaxpro.dll引用到網站
修改webconfig。在<system.web>元素中添加以下代碼
<httpHandlers>
<add path="ajaxpro/*.ashx" verb="POST,GET" type="AjaxPro.AjaxHandlerFactory, AjaxPro.2"/>/*這裡就是註冊的代碼*/
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpHandlers>
3對ajaxpro在頁page_load事件中進行運行註冊。如
protected void Page_Load(object sender, EventArgs e)
{
Response.Expires = -1;//清除頁面緩衝
AjaxPro.Utility.RegisterTypeForAjax(typeof(ZHGL_KHListAddandEdit));//將此後台頁面類,註冊到前台
if (!this.IsPostBack)
{
}
}
4伺服器方法的註冊
[AjaxPro.AjaxMethod(AjaxPro.HttpSessionStateRequirement.ReadWrite)]
//或者[AjaxPro.AjaxMethod()]
public DataTable DataBingCity(string prcID)
{
return DBUtility.DbHelperSQL.Query("select * from GG_City where ProvinceID=" + prcID + "").Tables[0];
}
使用者頁面js調用
//省市二級聯動
function GetCity(prcID) {
form1.ddlCity.length = 1;
var rsl = InvestCallSys.SeatMange.ZHGL_KHListAddandEdit.DataBingCity(prcID).value;//寫上完整的引用空間+類名+伺服器端註冊函數
if (rsl != null && typeof (rsl) == "object") {
for (var i = 0; i < rsl.Rows.length; i++) {
op = new Option(rsl.Rows[i]["Name"], rsl.Rows[i]["Name"]);
form1.ddlCity.options.add(op);
}
}
}
目前項目中用到最多的就是這種形式,之前還有一種是ExtJs方法,這是他們的官方網站http://extjs.org.cn/
寫到這裡我們再來看一下silverlight中,背景程式是如何和前台js互相操作的
public Container()
{
InitializeComponent();
VarList.Container = this;
txtWidth.Text = this.container.Width.ToString();
txtHeight.Text = this.container.Height.ToString();
HtmlPage.RegisterScriptableObject("xml", this);//註冊一個可以被指令碼調用的當前頁面的對象執行個體
if (HtmlPage.Window.GetProperty("GetValue") != null)//檢驗頁面指令碼是否存在該scripobject對象
HtmlPage.Window.Invoke("GetValue");
Application.Current.Host.Content.FullScreenChanged += new EventHandler(Content_FullScreenChanged);
}
這是一個xaml頁面載入時候執行個體化事件
這裡的htmlpage是一個靜態類(允許訪問和操作瀏覽器的文件物件模型(DOM)不同與(BOM瀏覽器物件模型)嘿嘿
這個類中可以將當前類註冊到前台,取名為xml
這裡跟ajaxpro類似,還需要將你要調用的後台方法前加屬性
[ScriptableMember]
public void SetNameAndXml(string xml)
{
if (!string.IsNullOrEmpty(HtmlPage.Document.QueryString["wfName"]))
wfname = HttpUtility.UrlDecode(HtmlPage.Document.QueryString["wfName"]);
if (!string.IsNullOrEmpty(HtmlPage.Document.QueryString["wfEntity"]))
_entitycode = HtmlPage.Document.QueryString["wfEntity"];
inputxml(xml);
}
然後前台頁面調用
function GetValue() {
var xaml = $get('Xaml1'); //window.dialogArguments.getxml()
xaml.content.xml.SetNameAndXml(window.dialogArguments.getxml());
}