مزایای استفاده از آجاکس :
وقتی تعداد زیادی فرم و ترافیک زیاد بین سرور و کلاینت داریم.
وقتی می خواهیم حجم زیادی داده را بدون نیاز به رفرش کردن فرم لود کنیم.
وقتی کاربر به طور مرتب از طریق فرم می خواهد قبل ازسابمیت کردن نهایی صفحه، داده ها را برایش نشان دهیم.
وقتی زمان پاسخ گویی اپلیکیشن بالا و مشکل آفرین است .
وقتی می خواهیم زمان لود آخرین دیتا در کوتاه ترین زمان ممکن باشد.
معایب آجاکس :
1- میتواند هزینه و زمان برنامه نویسی را زیاد کند .
2-هنوز کامپوننت های زیادی با این تکنولوژی نوشته نشده.
3-همه مشکلات مربوط به سیکیوریتی و ایمنی پاسخ داده نشده است .
4- عملیات کلیدهای نویگیتور و هیزتوری در اکسپلوررواقعی نیست .چون آدرس عوض نشده ولی دیتا عوض می شود .
5- مهمترین مشکل این است که بسیاری از کاربران اجازه اجرای جاوا اسکریپت را درIe. نمی دهند.
6- نمی توانید دیتا را از سرور دیگری بجز سرور خودتان بیاورید.
وقتی از آجاکس نمی توانید استفاده کنید :
وقتی صفحات شما استاتیک است .
وقتی سیستم شما با برازر قدیمی باید کارکند.
وقتی کاربر سیستم شما ارساال و دریافت زیادی ندارد . مثلا شرکت بسیار کوچک است
وقتی زمان و پهنای باند در لود داده ها برایتان مسئله مهمی نیست
وقتی اپلیکیشن شما چندان دیتای داینامیکی ندارد .
وقتی تیم پیاده سازی قوی ندارید!!!
وقتی کاربر سیستم شما اجازه اجرای جاوا اسکریپت را درآی ای. نمی دهد
وقتی می خواهید دیتا را از سرور دیگری بجز سرور خودتان بیاورید.
http://www.interaktonline.com/Support/Articles/Details
نکته :
آجاکس خالص تکنولوژی آجاکس است که بدون هیچ دی ال ال اضافه خودتان آن را کدنویسی می کنید.
نقطه مقابل آن استفاده از انواع و اقسام دی ال ال های نوشته شده با این تکنولوژی ست که نمی دانید درونش چه خبر است
و برای یادگیری آن هم باید بیشتراز خود آجاکس خالص وقت بگذارید .
یک مثال ساده و آسان با آجاکس خالص :
Simple Pure Ajax In .Net Frame Work :
با این مثال شما دو کومبوی مرتبط با هم را در صفحه وب خود را با تکنولوژی آجاکس پرمی کنید
:
مثلا داده های استان ها در کومبوی اول است و با تغییر استان ، داده های شهرستانهای هر استان با آجاکس در کومبوی دوم لود می شود.
برای راحت فهمیدن آجاکس این سه مرحله را جدا کنید.
1- فرم اصلی و درخواست داده
رفتن به سرور با کلیک روی اولین کومبو. کومبوی استان :
2- فرم جواب دهنده
ResponsePage.aspx
تشخیص اینکه درخواست از طرف کدام کومبو و با چه مقداری است-
گرفتن داده های مورد نظر کاربر از بانک
ارسال برای کاربر با فرمت ایکس ام ال
3- باز گشت به فرم اصلی
Msxml2.XMLHTTP گرفتن داده ها با اکتیو ایکس
یا
Microsoft.XMLHTTP
پر کردن داده ها با جاوا در کنترل مورد نظر
حالا تشریح این سه مرحله :
1- در فرم اصلی با نام
WebFrom1.aspx
دو عدد کومبو می گذارید داده های اولی اش را با نام و اندیس استانها پر می کنید و دومی را خالی می فرستید
برای رفتن به سرور با کلیک روی اولین کومبو. کومبوی استان
برای این کار باید هنگام
onchange
تابع جاوایی خاصی را صدا بزنیم
برای افزودن این امکان به کومبو :
Dropdownlist1.Attributes.Add("onchange", "return GetDataViaAJAX(Dropdownlist1,Dropdownlist2);");
این تابع جاوایی
(GetDataViaAJAX)
به صفحه ای در سرور می رود و داده ها را می گیرد.
فرض کنید نام آن صفحه این است :
ResponsePage.aspx
2-حالا به سرور آمده ایم در صفحه
ResponsePage.aspx
باید بفهمیم در خواست از طرف کدام کومبو به ما شده تا داده های متناسب را حاضر کنیم و بفرستیم.
از کجا بفهمیم ؟ از
که در کد های جاوایی قبلا خودمان ست کرده ایم QueryString:
string combovalue = Request.QueryString["Dropdownlist1"];
اگر مقداری داشتیم یعنی در خواست کاربر پر کردن شهرستانهای این استان است
if (combovalue !=null )
{
Response.Clear();
Response.ContentType = "text/xml";
Response.Write(FillShahrestanData( combovalue));
//گرفتن داده ها از اسکیوال سرور و فرستادنش با فرمت ایکس ام ال برای کاربر
Response.End();
FillShahrestanData
}
تابعی ست که کد استان را می گیرد و شهرستان های متناسب با آن را در یک دیتا تیبل از یک دیتا ست پر می کند و آن را به صورت فرمت
XML
برمی گرداند..
مثلا این طوری :
public string conectionString = "data source=mySql ;initial catalog=mydatabase;user id=sa ; ";
public string FillShahrestanData(string combovalue)
{
try
{
DataSet ds = new DataSet();
sqlstr =" Select index , sharestanName From List Where ostanIndex ="+combovalue;
SqlDataAdapter da =new SqlDataAdapter(sqlstr, conectionString);
da.Fill(ds ,"responseDataset" );//responseDataset نام جدول جواب است
da.Dispose ();
return ds.GetXml() ;
}
catch
{
return null ;
}
}
3- حالا به مرحله خوبش رسیدیم
مرحله سوم این است که کاربر با همان کدهای جاوایی و با تکنولوژی آجاکس داده هارا بگیرد و در کمبوی دوم یعنی شهرستان نمایش دهد
این کار را تابع
ResponseShow()
انجام می دهد
در دو مرحله اول گرفتن داده ها از
Msxml2.XMLHTTP
یا
Microsoft.XMLHTTP
بعد لود کردن آن در کومبوی دوم
LoadData()
داده شما پر شده تکنولوژی آجاکس دراختیار شماست
التماس دعا -بیایید برای ظهور دعا کنیم.
راستی این هم کدهای جاوایی اش که آن را در یک فایل به نام
TestAjax.js
می ریزیدو
با این تگ به صفحه اصلی تون لینک می کنید و برای کاربر می فرستید.
<script language="javascript" src="TestAjax.js"></script>
//****** AjaxScript.js **************//
var responsePageName = 'ResponsePage.aspx' ;//set response page for ajax (SET BY AJAX PROGRAMER )
var objfirstcombo; //Set Global Vaiable firstcombo for use in ProcessResponse() for clean last combo data and load new comboData
var objsecondcombo; //Set Global Vaiable secondcombo for use in ProcessResponse() for clean last combo data and load new comboData
// <summary>
// GetDataViaAjax :(MAIN Proccess Send Request)
// Send a request to server by ActiveXObject
// this response must back from responsePageName in Same http location
function GetDataViaAJAX(firstcombo,secondcombo)
{
//set combo global objects
objfirstcombo = firstcombo;
objsecondcombo = secondcombo;
// set query string for send to server which recognized which combo data
// must back from server in XML format.
var queryString = secondcombo.id+"=" + firstcombo.value;
var obj = SetActiveXobject(); // Set activeX object what Ajax Work by it !
if (obj !=null)
{
obj.onreadystatechange = ResponseShow;//set response function in Java
var responseURL = SetUrl( responsePageName , queryString) ;//Set Response URL
obj.open("GET", responseURL, true); //get xml response from responseURL of server
obj.send(null);
}//obj
return false;
}
// <summary>
// ProcessResponse:(MAIN Proccess Received Data)
// get xml data Backed from server
// if data is backed , load it to the combo
function ResponseShow()
{
var xmlData = GetReceivedData() ;
if (xmlData != null )
{
LoadData ( xmlData );
}
}//end processResponse
// <summary>
// SetActiveXobjext : ( called in GetDataViaAJAX)
// Set ActiveXObject Msxml2.XMLHTTP Or Microsoft.XMLHTTP
// This object is Kernel Of Ajax for get xml data from server
function SetActiveXobject()
{
try
{
obj = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e)
{
try
{
obj = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e1)
{
obj = null;
}
}
//alert (obj);
return obj ;
}
// <summary>
// SetUrl : (called in GetDataViaAJAX)
// Set entier Response URL By Adding Three Parts:
// 1 - Current URL Whithout This page
// 2 - Response Page Name
// 3 - QueryString
function SetUrl(responsePageName ,strQueryString )
{
var pos = 0;
var sumpos = 0;
currURL = (document.location.href).toLowerCase();//href or pathname is ok
//alert(currURL);
var endstr = currURL;
while (pos >= 0)
{
pos = endstr.indexOf('/', 0 );
endstr = endstr.substring(pos +1 ,endstr.length);//endstr.length - pos -1 );
sumpos =sumpos + pos +1;
}
var pathWithoutPage = currURL.substring(0 ,sumpos );// Get CurrentURL Without Current Page Name
var ResURL = pathWithoutPage + responsePageName +"?" +strQueryString ;// Add Three parts ;
//DEBUG:
//alert( vurl);
return ResURL;
}//SetUrl
// <summary>
// GetReceivedData: (called in ProcessResponse)
// if xml file is loaded completely
// and if everything is ok
// return xml data
function GetReceivedData()
{
var dsXml = null ;
if (obj.readyState == 4)/*Only process if xml file is loaded completely:4="Complete" */
{
if (obj.status == 200) /*Only process if everything is ok*/
{
dsXml =obj.responseXML.documentElement;
}//status =200
else
{
alert("Error retrieving data!" );
}
}//readyState == 4
return dsXml ;
}
// <summary>
// LoadData :(called in ProcessResponse)
// load xml data backed from server
// to second combo
function LoadData(xmlData)
{
ClearCombo(objsecondcombo);//Empty secondcombo options
var itemindexColumn = xmlData.getElementsByTagName('itemindex');//Get itemIndexColumn
var itemColumn = xmlData.getElementsByTagName('item'); // Get item Column
var combovalue;
var comboText;
var listItem; //combo list item
for (var count = 0; count < itemindexColumn.length; count++)//for all rows in index column
{
combovalue = (itemindexColumn[count].textContent || itemindexColumn[count].innerText || itemindexColumn[count].text);
comboText = (itemColumn[count].textContent || itemColumn[count].innerText || itemColumn[count].text);
listItem = new Option(comboText, combovalue, false, false);//New combo option
objsecondcombo.options[objsecondcombo.length] = listItem; //Add combo option
}
}//Load Data
function ClearCombo (combo)
{
for (var count = combo.options.length-1; count >-1; count--)
{
combo.options[count] = null;
}
}//ClearCombo