قرأت مؤخرًا كتابًا <<Ajax in Action>>. لقد استخدمت المعرفة الموجودة في الكتاب ودمجتها مع .net لكتابة هذه المقالة حول استخدام .net لمعالجة xmlHttp لإرسال طلبات غير متزامنة.
ما نريد تحقيقه هو النقر فوق الزر للحصول على الوقت الحالي للخادم، ويكون HTML الخاص بـ aspx كما يلي:
أتش تي أم أل
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Linkedu.Web.WebWWW.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns=" http://www.w3.org/1999/xhtml " >
<رئيس التشغيل = "الخادم">
<العنوان>اختبار</title>
<script language="javascript" src="javascript/prototype/extras-array.js"></script>
<script language="javascript" src="javascript/xmlHttp.js"></script>
<script language="javascript" src="javascript/eventRouter.js"></script>
<script language="javascript" src="Default.js"></script>
<لغة البرمجة = "جافا سكريبت">
</script>
</الرأس>
<الجسم>
<معرف النموذج = "form1" runat = "الخادم">
احصل على الوقت الحالي للخادم باستخدام طريقة النشر
<input id = "btnTestPost" type = "button" value = "Post" />
احصل على الوقت الحالي للخادم باستخدام طريقة Get
<input id = "btnTestGet" type = "button" value = "Get" />
<div id="divResult"></div>
</النموذج>
</الجسم>
</html>
لاستخدام جافا سكريبت لإرسال طلبات xmlHttp، المشكلة التي يجب حلها هي الدعم عبر المتصفحات. نقوم بتغليف إرسال xmlHttp في كائن جافا سكريبت، وفي نفس الوقت نقوم بحل مشكلة دعم المتصفحات المتقاطعة في هذا الكائن. الكود كما يلي:
كائن xmlHttp
/**//*
كائن تحميل URL وقائمة انتظار الطلبات المبنية فوقه
*/
/**//* كائن تحديد الاسم */
var net=new Object();
net.READY_STATE_UNINITIALIZED=0;
net.READY_STATE_LOADING=1;
net.READY_STATE_LOADED=2;
net.READY_STATE_INTERACTIVE=3;
net.READY_STATE_COMPLETE=4;
/**//*--- كائن محمل المحتوى للطلبات عبر المتصفحات ---*/
net.xmlHttp=function(url, onload, params,method, contentType, onerror){
this.req=null;
this.onload=onload;
this.onerror=(onerror) ؟
إذا (نوع (طريقة) == "غير محدد" || طريقة == خالية)
{
الطريقة = "POST";
}
this.loadXMLDoc(url,params,method,contentType);
}
net.xmlHttp.prototype.loadXMLDoc=function(url,params,method,contentType){
إذا (! الطريقة) {
طريقة = "الحصول على"؛
}
إذا (!contentType &&method=="POST"){
contentType='application/x-www-form-urlencoded';
}
إذا (window.XmlHttpRequest){
this.req=new XmlHttpRequest();
} وإلا إذا (window.ActiveXObject){
this.req=new ActiveXObject("Microsoft.xmlHttp");
}
إذا (هذا.الطلب){
يحاول{
فار محمل=هذا;
this.req.onreadystatechange=function(){
net.xmlHttp.onReadyState.call(loader);
}
this.req.open(method,url,true);
إذا (نوع المحتوى) {
this.req.setRequestHeader('نوع المحتوى', contentType);
}
this.req.send(params);
}قبض (يخطئ){
this.onerror.call(this);
}
}
}
net.xmlHttp.onReadyState=function(){
فار req=this.req;
var Ready=req.readyState;
إذا (جاهز==net.READY_STATE_COMPLETE){
var httpStatus=req.status;
إذا (httpStatus==200 || httpStatus==0){
this.onload.call(this);
}آخر{
this.onerror.call(this);
}
}
}
net.xmlHttp.prototype.defaultError=function(){
تنبيه ("خطأ في جلب البيانات!")
+"nnreadyState:"+this.req.readyState
+"nالحالة: "+this.req.status
+"nheaders: "+this.req.getAllResponseHeaders());
}
لنبدأ بكتابة الكود لإرسال طلب xmlHttp:
default.js
// كائن xmlHttp العالمي
var cobj
/**//* بداية النشر*/
// ربط النشر لإرسال حدث xmlHttp إلى btnTestPost
تحميل الدالةTestPost()
{
var iobj = document.getElementById("btnTestPost");
// ملزم للاستماع إلى زر btnTestPost
var clickRouter=new jsEvent.EventRouter(iobj,"onclick");
clickRouter.addListener(btnTestPostClick);
}
الدالة btnTestPostClick()
{ // فتح عنوان URL للمعلمات، onload، المعلمات، الطريقة، contentType، onerror
cobj = new net.xmlHttp("DefaultHandler.ashx",dealResult, "<T/>", "POST");
}
/**//*نهاية المشاركة*/
/**//*البدء*/
// Bind احصل على إرسال حدث xmlHttp إلى btnTestGet
تحميل الدالةTestGet()
{
var iobj = document.getElementById("btnTestGet");
// btnTestGet ربط زر الاستماع
var clickRouter=new jsEvent.EventRouter(iobj,"onclick");
clickRouter.addListener(btnTestGetClick);
}
الدالة btnTestGetClick()
{ // فتح عنوان URL للمعلمات، onload، المعلمات، الطريقة، contentType، onerror
cobj = new net.xmlHttp("DefaultHandler.ashx?T=1",dealResult, null, "GET");
}
/**//*النهاية*/
دالة الصفقة ()
{
var dobj = document.getElementById("divResult");
dobj.innerHTML = cobj.req.responseXML.text;
}
window.onload = وظيفة ()
{
// ربط النشر لإرسال حدث xmlHttp إلى btnTestPost
LoadTestPost();
// Bind احصل على إرسال حدث xmlHttp إلى btnTestGet
LoadTestGet();
};
الأخير هو رمز معالجة .net xmlHttp
يعالج .net طلبات xmlHttp
الفئة العامة DefaultHandler: IHttpHandler
{
XmlDocument المحمي _xmlResult؛
ProcessRequest العام الفارغ (سياق HttpContext)
{
إذا (context.Request["T"] != null)
{//احصل على اختبار xmlhttp
context.Response.ContentType = "text/xml";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(string.Format(@"<time>GET:{0}</time>", System.DateTime.Now));
xmlDoc.Save(context.Response.OutputStream);
context.Response.End();
}
آخر
{// اختبار XMLhttp
context.Response.ContentType = "text/xml";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(context.Request.InputStream);
إذا (xmlDoc.DocumentElement.Name == "T")
{
xmlDoc.LoadXml(string.Format(@"<time>POST:{0}</time>", System.DateTime.Now));
xmlDoc.Save(context.Response.OutputStream);
context.Response.End();
}
}
}
المنطق العام قابل لإعادة الاستخدام
{
يحصل
{
عودة كاذبة.
}
}
}
http://www.cnblogs.com/laiwen/archive/2006/12/26/604050.html