أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

إن المستعرض الذي تستخدمه غير معتمد

إنك تحتاج إلى تحديث المستعرض لاستخدام الموقع.

التحديث إلى أحدث إصدار من Internet Explorer

تحديثات الصفحة الديناميكية باستخدام XMLHTTP

هام: تمت ترجمة هذه المقالة باستخدام برامج مايكروسوفت للترجمة الآلية ومن المحتمل ان يتم تحريرها او تدقيقها بعد ذلك من خلال تكنولوجيا منصة مجموعات الترجمة(CTF) او من خلال مترجم بشري. تقدم لك شركة مايكروسوفت هذه المقالات المترجمة بشكل آلي او بالترجمة البشرية او بعد تحريرها وتدقيقها من قبل مجموعات الترجمة حتى تمكنكم من الوصول إلى جميع المقالات الموجودة في قواعد المعرفة لديها بلغات مختلفة. إلا أن المقالات المترجمة قد تحتوي على أخطاء في المفردات او بناء الجمل او النحو. وعليه، فإن شركة مايكروسوفت ليست مسؤولة عن اية أخطاء او عدم دقة في الترجمة او أية أضرار قد تحدث نتيجة أخطاء في ترجمة محتويات النص او استخدامه من قبل العملاء.

اضغط هنا لرابط المقالة باللغة الانجليزية893659
عمود "الصوت دعم" ASP.NET

تحديثات الصفحة الديناميكية باستخدام XMLHTTP

لتخصيص هذا العمود إلى احتياجاتك، نرغب في دعوتك إلى إرسال أفكارك حول مواضيع تهمك والمشكلات التي تريد أن ترى تناولها في مقالات قاعدة المعارف القادمة والأعمدة "دعم الصوت". يمكنك إرسال أفكارك واستخدام الملاحظات السؤال عنه . يوجد أيضا ارتباط إلى النموذج في الجزء السفلي من هذا العمود.
مقدمة حول
أحد الطرق المفضلة دراسة قابلية الاستخدام في تطبيق ويب لمشاهدة زوجتي التنقل حول موقع ويب. أنها يمكن أن تجعل طريقها حول الإنترنت شكل جيد، ولكن تعرف القليل عن انخفاض مستوى الجوانب التقنية (ما هي تسمية "الأشياء مملة") التي تجعل من كل عمل.

مساء الأخيرة، كنت أشاهد زوجتي الاطلاع على تطبيق تجارة الإلكترونية من أحد الكبار. تم النزول أنها إلى منتج سرد باستخدام عدة القوائم المنسدلة، كل منها التغذية من خارج التحديد الذي تم مسبقاً. كما أنها بالنقر فوق عنصر في كل القائمة المنسدلة، يتم نشر الصفحة مرة أخرى الحصول على بيانات لآخر القائمة المنسدلة. التجربة كان محبطاً لها سبب لديها انطباعا بأنها تتخذ وقتاً طويلاً نظراً لظهور وظيفة.

مستوى الإحباط أنها تواجه يمكن أن يكون لديك بسهولة خف مطورو التطبيق في حالة استخدام XMLHTTP لاسترداد البيانات بدلاً من الترحيل مرة أخرى فقط. وهذا ما حول العمود هذا الشهر. سوف تظهر لك كيفية استخدام XMLHTTP لتحديث جزء من صفحة ويب مع البيانات من خدمة Microsoft ASP.NET على ويب بدون القيام بعملية نشر مرة أخرى. وهذا سيكون باردا! ثق بي.

نظرة عامة حول

يعمل XMLHTTP عن طريق إرسال طلب إلى ملقم ويب من قبل العميل وإرجاع جزيرة بيانات XML. اعتماداً على هيكل XML التي تم تلقيها، يمكنك استخدام XSLT أو XML DOM للتعامل معه وربط أجزاء من الصفحة إلى تلك البيانات. هذا أسلوب قوي للغاية.

ملاحظةتقدم Microsoft سلوك "خدمة ويب" ل Internet Explorer إجراء الاستدعاءات غير المتزامنة لخدمات ويب ASP.NET سهلة وسريعة. ومع ذلك، لا يتم اعتماد هذا السلوك ولم يكن أفضل طريقة لتحديث صفحة بشكل غير متزامن. يجب عليك استخدام XMLHTTP بدلاً من ذلك!

في المثال سوف أعمل من خلال في هذا العمود، سوف أقوم ثلاث مكالمات خدمة ويب إلى خدمة ويب ASP.NET عن طريق XMLHTTP. خدمة ويب سيتم الاستعلام عن قاعدة البيانات Northwind على SQL Server المحلية وتقوم بإرجاع مجموعة بيانات إلى العميل في النموذج من diffgram XML. وسوف ثم استخدام XML DOM لتحليل تلك البيانات XML وتحديث أجزاء من الصفحة الخاصة بي بشكل حيوي. سيتم إجراء كل ذلك دون بعد الظهر.

خدمة ويب

تتضمن خدمة ويب التي سوف تستخدم يسمى دينابرودوكتس. وخدمة ويب ASP.NET أساسية التي يتم كتابتها في C# والتي تحتوي على الطرق الثلاث التالية.
  • GetCategories – إرجاع مجموعة بيانات التي تحتوي على كافة الفئات الموجودة في جدول "الفئات".
  • جيتبرودوكتس – إرجاع مجموعة بيانات التي تحتوي على كافة منتجات الفئة التي تم تمريرها إلى الأسلوب.
  • جيتبرودوكتديتايلس – إرجاع مجموعة بيانات التي تحتوي على تفاصيل حول المنتج معرف المنتج التي يتم تمريرها إلى الأسلوب.

صفحة HTML

أول شيء التي قد تصيب حول هذا النموذج أن الصفحة أن أنا تحديث على الرغم من خدمة ويب ASP.NET غير صفحة ASP.NET. من صفحة HTML عادية فقط. ومع ذلك، لقد أضفت قدرا كبيرا من JavaScript العميل إلى الصفحة، وهو ذلك البرنامج النصي الذي يقوم بإجراء الاستدعاءات إلى خدمة ويب.

هيا نلقي النظر على القصاصة الأولى من التعليمات البرمجية من صفحة HTML.
var objHttp;var objXmlDoc;function getDataFromWS(methodName, dataSetName, wsParamValue, wsParamName){    // create the XML object    objXmlDoc = new ActiveXObject("Msxml2.DOMDocument");    if (objXmlDoc == null)    {        alert("Unable to create DOM document!");            } else {	    // create an XmlHttp instance	    objHttp = new ActiveXObject("Microsoft.XMLHTTP");			    // Create the SOAP Envelope	    strEnvelope = "<soap:Envelope xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +		            " xsd=\"http://www.w3.org/2001/XMLSchema\"" +		            " soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +		            "  <soap:Body>" +		            "    <" + methodName + " xmlns=\"http://jimcoaddins.com/DynaProducts\">" +		            "    </" + methodName + ">" +		            "  </soap:Body>" +		            "</soap:Envelope>";			    // Set up the post	    objHttp.onreadystatechange = function(){		        // a readyState of 4 means we're ready to use the data returned by XMLHTTP	        if (objHttp.readyState == 4)	        {		            // get the return envelope	            var szResponse = objHttp.responseText;								            // load the return into an XML data island	            objXmlDoc.loadXML(szResponse);		            if (objXmlDoc.parseError.errorCode != 0) {	                var xmlErr = objXmlDoc.parseError;	                alert("You have error " + xmlErr.reason);	            } else {		                switch(dataSetName)	                {	                    case "CategoriesDS":	                        processCategory();	                        break;		                    case "ProductsDS":	                        processProducts();	                        break;		                    case "ProductDetailDS":	                        processProductDetails();	                        break;		                }	            }		        }	     }		    var szUrl;	    szUrl = "http://dadatop/wsXmlHttp/DynaProducts.asmx/" + methodName;		    if (wsParamValue != null)	    {		        szUrl += "?" + wsParamName + "=" + wsParamValue;	    }		    // send the POST to the Web service	    objHttp.open("POST", szUrl, true);	    objHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");	    objHttp.send(strEnvelope);	  }}
هذا هو أكبر قطعة من التعليمات البرمجية من الصفحة، وأريد أن اذهب أكثر من ذلك بالتفصيل حيث عليك فهم ما يحدث.

في أعلى كتلة البرنامج النصي هذا، قمت بإنشاء اثنين من المتغيرات: أوبجهتب و أوبجكسملدوك. هذه هي المتغيرات التي سوف تستخدم لكائن XMLHTTP الخاص بي وكائن XML DOM الخاصة بي. مباشرة بعد ذلك هو تعريف دالة للدالة جيتداتافروموس . وهذه هي الدالة المسؤولة عن إجراء استدعاء العميل إلى خدمة ويب. يأخذ التالية أربع وسائط، اثنتان منها اختيارية:
  • methodName – اسم الأسلوب للاتصال على خدمة ويب.
  • داتاسيتنامي -اسم قاعدة البيانات التي يتم إرجاعها بواسطة خدمة ويب.
  • وسبارامفالوي – قيمة المعلمة التي يتم تمريرها إلى خدمة ويب إذا كان ذلك ممكناً. (اختياري)
  • وسبارامنامي -اسم المعلمة التي يتم تمريرها إلى خدمة ويب إذا كان ذلك ممكناً. (اختياري)
دعنا قطع الدالة جيتداتافروموس إلى أجزاء وتناقش كل منها. وإليك القصاصة الأولى:
// create the XML object    objXmlDoc = new ActiveXObject("Msxml2.DOMDocument");    if (objXmlDoc == null)    {    		alert("Unable to create DOM document!");    } else {		// create an XMLHTTP instance		objHttp = new ActiveXObject("Microsoft.XMLHTTP");
هذه الكتلة من التعليمات البرمجية بإنشاء كائن XMLHTTP وكائن مستند XML. وبعد ذلك، ابدأ إنشاء مغلف SOAP.
// Create the SOAP EnvelopestrEnvelope = "<soap:Envelope xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +	          " xsd=\"http://www.w3.org/2001/XMLSchema\"" +	          " soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +	          "  <soap:Body>" +	          "    <" + methodName + " xmlns=\"http://jimcoaddins.com/DynaProducts\">" +	          "    </" + methodName + ">" +	          "  </soap:Body>" +	          "</soap:Envelope>";
في هذه التعليمة البرمجية، أنا أشعر بتعيين مغلف SOAP إلى متغير سلسلة حيث أنه يمكن تمرير إلى خدمة ويب. من السهل فعلياً تماما لاكتشاف كيفية تنسيق مغلف SOAP لخدمة ويب الخاصة بك. ببساطة استعرض للوصول إلى خدمة ويب، وانقر فوق إحدى الطرق لمشاهدة مغلف SOAP لهذا الأسلوب. على سبيل المثال، إليك ما أراه عند استعراض إلى أسلوب GetCategories وسكسملهتب خدمة ويب التي تم إنشاؤها لهذه المقالة:

envelope.png

ASP.NET يوضح لك كيفية تنسيق مغلف SOAP HTTP POST و HTTP GET. في المثال المقدمة في هذه المقالة، سوف تستخدم HTTP POST.

حتى الآن جيدة جداً. الآن دعنا ننظر إلى الجزء التالي من التعليمات البرمجية.
// Set up the postobjHttp.onreadystatechange = function(){	// a readyState of 4	means we're ready to use the	data returned by	XMLHTTP	if (objHttp.readyState == 4)	{			// get	the return envelope		   var	szResponse	= objHttp.responseText;			   // load	the return into an XML data island		   objXmlDoc.loadXML(szResponse);			   if (objXmlDoc.parseError.errorCode != 0) {			var xmlErr =	objXmlDoc.parseError;				 alert("You have error " + xmlErr.reason);	}	else		{		switch(dataSetName)				{					case "CategoriesDS":						processCategory();						break;					case "ProductsDS":						processProducts();						break;					case "ProductDetailDS":					processProductDetails();						break;				}			}
عندما يتم الطلب عن طريق XMLHTTP، تستخدم كائن XMLHTTP خاصية readyState لتعقب حالة الطلب. عندما يتم تلقي كافة البيانات من خدمة ويب مرة أخرى، تتغير الخاصية readyState إلى قيمة 4. تتيح لك لإعداد وظيفة رد اتصال الذي سيتم استدعاؤه عند تغيير الخاصية readyState الخاصية onreadystatechange لكائن XMLHTTP. عن طريق التأكد من تلقي البيانات بأكمله، أنا الاحتفاظ من العمل على تلك البيانات حتى أنا مستعد.

بمجرد تلقي كافة البيانات، يمكنني إنشاء جزيرة بيانات XML بالاستجابة باستخدام الخاصية ريسبونسيتيكست . كما المحتمل أن تعرف، الاستجابة من خدمة ويب في تنسيق XML. في هذه الحالة، إرجاع Microsoft ADO.NET DataSet.

يستخدم الجزء التالي من هذه الكتلة من التعليمات البرمجية عبارة تبديل لاستدعاء الدالة المناسبة استناداً إلى اسم DataSet التي يتم إرجاعها من خدمة ويب. سوف اذهب إلى التعليمات البرمجية لهذه المهام بالتفصيل قليلاً في وقت لاحق.

الآن لنلق نظرة على التعليمات البرمجية التي فعلياً بتنفيذ طلب XMLHTTP.
var szUrl;	szUrl = "http://dadatop/wsXmlHttp/DynaProducts.asmx/" + methodName;		if (wsParamValue != null)	{		      	szUrl += "?" + wsParamName + "=" + wsParamValue;	}	// send the POST to the Web service	objHttp.open("POST", szUrl, true);	objHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");	objHttp.send(strEnvelope);
المتغير سزورل يحتوي على URL الذي يتم استخدامه لاستدعاء خدمة ويب من أجل الوضوح. ثم يكون if عبارة المسامير على أي من المعلمات التي تم تمريرها كقيمة سلسلة استعلام مواقع المعلومات . في البيئة الخاصة بك، قد تحتاج لإضافة المعلمات إلى مغلف SOAP. وفي كلتا الحالتين ستعمل على ما يرام.

يتم استدعاء الأسلوب فتح كائن XMLHTTP التالي. لقد استعملت الوسيطات الثلاثة الأولى للأسلوب open; الأسلوب URL وقيمة منطقية تحدد ما إذا كان الاستدعاء غير متزامنة.
هام إذا تم إجراء استدعاء غير متزامن وأنا هنا، يجب إعداد وظيفة رد اتصال من خلال الخاصية أونريديستاتيتشانجيد .

بعد إعداد عنوان الطلب لنوع المحتوى، أرسل الطلب كمغلف SOAP باستخدام متغير سلسلة تعبئة سابقا.

لقد انتقلنا الآن على كل من التعليمات البرمجية التي يقوم بإجراء الطلب XMLHTTP. الآن دعنا إلقاء نظرة على التعليمات البرمجية للتعامل مع الواجهة في المستعرض والذي يعالج الاستجابة من استدعاء خدمة ويب.

أولاً سوف نبحث في الدالة التي يتم استدعائها عند تحميل الصفحة.
function getCategories(){  var func = "getDataFromWS('GetCategories', 'CategoriesDS')";  document.all.lblCategoryDropdown.innerText = "Please wait while data is retrieved...";  window.setTimeout(func, 1);  }
أول ما أفعل في هذه الدالة إنشاء متغير لتخزين التوقيع الدالة جيتداتافروموس. أفعل ذلك لأنه سوف استدعاء window.setTimeout في نهاية هذه الدالة لاستدعاء الدالة جيتداتافروموس . الغرض من هذا الأسلوب السماح لي بعرض الحالة للمستخدم بينما كان ينتظر استدعاء خدمة ويب لإكمال. لاحظ أن أنا على تغيير innerText من DIV لعرض رسالة تشير إلى أن يتم استرداد البيانات. بعد ذلك جدولة الدالة جيتداتافروموس من خلال استدعاء window.setTimeout ، وأنا تعيينها ليتم تشغيله في ميلي ثانية واحدة.

معالجة الاستجابة خدمة ويب

تذكر قبل استخدام الخاصية أونريديستاتيتشانجيد لتكوين وظيفة رد اتصال. تذكر أن كشف المبدل الذي يستدعي دالة معينة استناداً إلى اسم DataSet يحتوي على دالة رد الاتصال. في هذه الحالة، اسم مجموعة البيانات الخاص بنا هو كاتيجوريسدس. لذلك، سيتم استدعاء دالة بروسيسكاتيجوري من دالة رد الاتصال. دعنا إلقاء نظرة على هذه الدالة لمعرفة كيفية استخدام XML DOM لتحليل خارج الاستجابة من خدمة ويب.
function processCategory(){  // get an XML data island with the category data  objNodeList = objXmlDoc.getElementsByTagName("Categories");   // add default value to the drop-down  document.forms[0].drpCategory.options[0] = new Option("Select a Category", 0);  // walk through the nodeList and populate the drop-down  for (var i = 0; i < objNodeList.length; i++)   {      var dataNodeList;      var textNode;      var valueNode;      dataNodeList = objNodeList[i].childNodes;      valueNode = dataNodeList.item(0);      textNode = dataNodeList.item(1);      document.forms[0].drpCategory.options[i + 1] = new Option(textNode.text, valueNode.text);      document.all.lblCategoryDropdown.innerText = "Select a Category:";      document.forms[0].drpCategory.style.visibility = "visible";           }  }
تذكر أن الدالة جيتداتافروموس تحميل XML من الاستجابة إلى كائن أوبجكسملدوك . في دالة بروسيسكاتيجوري ، أنا أخذ هذا XML وتحليل من خلال ذلك لملء القائمة المنسدلة الفئة.

أول ما أقوم به إنشاء كائن إيكسملدومنوديليست باستخدام جزء من استجابة XML. يتم إرجاع مجموعة البيانات أنا عائد من استدعاء خدمة ويب ك diffgram، وهو الجزء الوحيد من هذه الاستجابة أنا مهتم في البيانات من DataTable التي لقد تم إدراج في مجموعة البيانات. يمكن أن احصل على ذلك عن طريق إنشاء كائن إيكسملدومنوديليست من كتلة XML التي تحتوي على DataTable.

إذا نظرت في التعليمات البرمجية الخاصة بخدمة ويب، سترى أن إنشاء DataTable التي تسمى فئات وإضافتها إلى مجموعة البيانات. عندما يتم إرجاع XML من خدمة ويب، يتم تضمين مجموعة البيانات داخل كتلة <CategoriesDS>، وكل صف من DataTable موجود ضمن كتل <Categories>منفصلة كما هو موضح في ملف XML أدناه.

</Categories></CategoriesDS>الملفات التالية غير متوفرة للتحميل من Microsoftمركز التحميل:
تنزيلقم بتنزيل الحزمة GetCategories.xml الآن.
تنزيلقم بتنزيل الحزمة WSXMLHTTP.exe الآن.لمزيد من المعلومات حول كيفية تنزيل ملفات دعم Microsoft، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف ل Microsoft":
119591 كيفية الحصول على ملفات دعم Microsoft من الخدمات عبر الإنترنت
قامت Microsoft فحص هذا الملف بحثاً عن الفيروسات. واستخدمت شركة Microsoft أحدث برامج الكشف عن الفيروسات التي كانت متوفرة وقت نشر الملف. يتم تخزين الملف على خوادم محسنة الأمان التي تساعد على منع التغييرات غير المصرح بها إلى الملف.

للحصول على كتلة XML التي تحتوي على تلك DataTable، يمكنني استخدام التعليمات البرمجية التالية:
objNodeList = objXmlDoc.getElementsByTagName("Categories");
وهذا بإرجاع كائن IXMLDOMNodeList يحتوي على كل عقده <Categories>. أنا ثم أعاد من خلال هذا قائمة باستخدام للحلقة.</Categories>
// walk through the nodeList and populate the drop-down  for (var i = 0; i < objNodeList.length; i++)   {      var dataNodeList;      var textNode;      var valueNode;      dataNodeList = objNodeList[i].childNodes;      valueNode = dataNodeList.item(0);      textNode = dataNodeList.item(1);      document.forms[0].drpCategory.options[i + 1] = new Option(textNode.text, valueNode.text);      document.all.lblCategoryDropdown.innerText = "Select a Category:";      document.forms[0].drpCategory.style.visibility = "visible";           }
أعرف مسبقاً كل عقده <Categories>أن عقدتين أحتاج: العقدة <ID>والعقدة <CategoryName>. لذلك، أول شيء فعله هو إنشاء جديد من إيكسملدومنوديليست وملئه بالعقد التابعة الحالي <Categories>العقدة.</Categories> </CategoryName> </ID> </Categories>
dataNodeList = objNodeList[i].childNodes;
أنا ثم استخدم الأسلوب عنصر للوصول إلى كل من العقد التي بحاجة لملء المنسدلة الخاصة بي. الحقل " معرف _ الفئة " من قاعدة بيانات تحتوي على العقدة الأولى، والعقدة الثانية يحتوي على الحقل اسم الفئة من قاعدة البيانات. أنا إنشاء كائن خيار جديد وتعيين النص إلى اسم الفئةبتعيين القيمة إلى "معرف الفئة"وإضافته إلى دربكاتيجوري القائمة المنسدلة. تستخدم التعليمة البرمجية المستخدمة في دالتي المتبقية نفس الأسلوب لسحب البيانات المطلوبة من استجابة XML وملء أجزاء من الصفحة.

ملاحظةنظراً لأننا نتعامل مع كميات صغيرة من البيانات هنا، استخدام DOM تعتبر هذه طريقة رائعة لسحب البيانات نحتاج. إذا كنت تتعامل مع كمية كبيرة من البيانات، يمكنك اختيار استخدام XSLT بدلاً من ذلك.

كيفية التأكد من كل عمل

الآن لقد غطت رملي تفاصيل كيفية عمل كل هذا، فإن وقت الانتقال على كيفية استخدام ملفات العينة تضمين لمشاهدته في العمل بنفسك.

نشر خدمة ويب

لنشر خدمة ويب ASP.NET، ببساطة بفك العينة خدمة ويب المرفقة إلى جذر خادم الويب الخاص بك. ستحتاج لفتح التعليمات البرمجية ل DynaProducts.asmx وتغيير سلسلة الاتصال. على الأقل، ستحتاج إلى إدخال كلمة مرور SA. بعد إجراء هذا التغيير، قم بإعادة ترجمة خدمة ويب.

نشر ملف HTML

ملف HTML يحتوي على متغير المسمى سزورل الذي يحتوي على عنوان URL لخدمة ويب. ستجد هذا المتغير في الدالة جيتداتافروموس بالقرب من أسفل للدالة. سوف تحتاج إلى تغيير هذا إلى عنوان URL الخاص بخدمة ويب التي قمت بنشر أعلاه.

بعد منشورة كلا من خدمة ويب وملف HTML، استعرض إلى ملف HTML. عند تحميله، سيتم ملء القائمة المنسدلة الفئة عن طريق الطلب XMLHTTP الأول إلى خدمة ويب. بمجرد أن يتم نشر، حدد فئة لبدء الطلب XMLHTTP التالي الذي يقوم بملء القائمة منسدلة المنتجات. تحديد منتج من منتجات المنسدلة بتعبئة جدول مع بيانات حول هذا المنتج.

لاحظ أن عدم نشر الصفحة مرة أخرى أثناء أي من هذه الطلبات XMLHTTP. هذا هو الرائع طلبات XMLHTTP. إذا كنت قد فعلت هذا على صفحة كبيرة، الصفحة قد بينما يتواصل موضعه التمرير دون "وميض" على المستخدم. إذا كنت تسألني، التي هي بعض الأشياء قوية جداً!

شيئا آخر: في هذه المقالة باستخدام XMLHTTP لاستعلام خدمة ويب. يمكن أن يكون بسهولة استخدمه للتقدم بطلب لصفحة ASPX أو صفحة ASP. كيف يمكن وضع هذه التقنية لاستخدام الإمكانيات لا حصر لها. أرجو أن تجد XMLHTTP مفيدة في تطوير تطبيق الويب الخاص بك المستقبلية.
أنه دائماً، إرسال لا تتردد في إرسال أفكار حول المواضيع التي تريدها في المستقبل أعمدة أو في قاعدة المعارف ل Microsoft باستخدام السؤال عنه .

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 893659 - آخر مراجعة: 06/28/2013 01:22:00 - المراجعة: 6.0

  • Microsoft ASP.NET 1.0
  • Microsoft ASP.NET 1.1
  • kbgraphic kbscript kbxml kbhowto kbmt KB893659 KbMtar
تعليقات
0&did=1&t=">p;did=1&t=">&did=1&t=">