2010-02-16 13 views
9

मैं ASP.NET में अपने ही AJAX लिखते हैं, और नहीं ASP.NET ScriptManager उपयोग करना चाहते हैं, आदिमैन्युअल बनाने AJAX ASP.NET में कॉल करता है और सी #

क्यों? मुझे मैन्युअल रूप से सामान करना पसंद है और यह जानना कि सामान कैसे अंदर से काम करता है, इसलिए मैं इसे अपने लिए करना चाहता हूं।

तो मेरे सवाल है, मैं एक AJAX कॉल करने के बाद:

var ajaxCall = new XMLHttpRequest(); 
.... 
ajaxCall.send(null) 

मैं कैसे, सी # में, Page_Load में (नहीं या) जोड़ सकते हैं इतना है कि यह इस बात के लिए सुनता है और उदाहरण के लिए एक स्ट्रिंग रिटर्न ।

उत्तर

4

+1 आपके लिए चीजें करने के लिए +1 - मुझे यह जानना अच्छा लगता है कि मैं अपने लिए ऐसा करने वाले ढांचे का उपयोग करने से पहले खुद चीजें कर सकता हूं, इसलिए यदि यह स्तन हो जाता है, तो मुझे पता है कि इसे ठीक करना कैसे शुरू किया जाए।

वैसे भी आपके प्रश्न के नीचे। सामान्य रूप से एएसपी.NET या Response.Write का उपयोग कर डेटा आउटपुट। यदि आप POST अनुरोध कर रहे हैं, तो आप पेज पेज लोड में इसका उपयोग कर सकते हैं (पेज.इस्पोस्टबैक।) याद रखें कि आम तौर पर आप केवल पृष्ठ के हिस्से के लिए डेटा भेज देंगे, न कि संपूर्ण पृष्ठ स्वयं, ताकि आप <html>, <head> या <body> टैग की आवश्यकता नहीं होगी।

जब मैं इस से पहले ASP.NET वेबसाइटों में किया देखा है, अलग पन्नों AJAX के लिए इस्तेमाल किया गया है कहता है (उदाहरण के लिए index.aspx = सामान्य साइट, सूचकांक-ajax.aspx = ajaxified पेज घटक।)

if (Page.IsPostBack) 
{ 
    Response.Write("Hello, world! From AJAX."); 
} 

आप Page.IsPostBack उपयोग करने के लिए, सबसे AJAX अनुरोध सिर्फ इसलिए यदि आप अपने Page_Load में डाल के प्राप्त कर रहे हैं, की जरूरत नहीं है:

Response.Write("Hello, world! From AJAX."); 

तो उस पृष्ठ के लिए एक AJAX कॉल करते हैं, आप मिल जाएगा "हैलो, दुनिया! AJAX से।" AJAX कॉल से वापस आ गया।

+0

:

तो, अपने खिलौना उदाहरण में अगर आप एक AJAX अनुरोध करने के लिए अलग तरीके से प्रतिक्रिया करना चाहता था यह अच्छी तरह से काम करता है। बहुत धन्यवाद। मैंने एक अलग पृष्ठ बनाया जो वास्तव में वही देता है जो मैं ढूंढ रहा हूं। बहुत धन्यवाद।यद्यपि यह एक अक्षम विधि की तरह दिखता है, जो मैंने अन्य उत्तरों से जो पढ़ा है उसके आधार पर। बहुत धन्यवाद! –

+0

हाँ आदर्श रूप से आप एएसपी मार्कअप आदि में अपना पेज बनायेंगे, यह सिर्फ एक त्वरित उदाहरण था। अन्य लोगों ने भी कहा है कि, एएसपी.नेट एजेक्स हैंडलिंग वास्तव में सभ्य और मृत सरल है (आपको एक अलग पृष्ठ या अलग कोड की भी आवश्यकता नहीं है) - या jQuery क्लाइंट-साइड के लिए समान रूप से शानदार है, लेकिन जैसा आपने कहा था एक सीखने का अभ्यास था। –

1

आपकी सर्वश्रेष्ठ शर्त एक हैंडलर फ़ाइल (* .ashx) बनाने के लिए होगी जो आने वाले अनुरोध को संसाधित करेगी और जावास्क्रिप्ट में उचित स्वरूपित जेसन/एक्सएमएल वापस कर देगी। स्क्रिप्ट मैनेजर का उपयोग इस सामग्री को सीधे वास्तविक पृष्ठ में एम्बेड करने के लिए किया जाता है, लेकिन (जब तक आप स्क्रिप्ट मैनेजर को पूरी तरह से पुनर्निर्माण नहीं करना चाहते) तो आपको इसे हैंडलर के माध्यम से करना आसान होगा और मानक अनुरोध के आईआईएस प्रसंस्करण को बाईपास करना होगा।

+0

हाँ आप सही हैं। जेनेरिक हैंडलर AJAX के लिए आदर्श हैं क्योंकि यह asp.net पृष्ठ से हल्का है। – Adeel

+0

मैं निश्चित रूप से यह कोशिश करूँगा! बहुत धन्यवाद! –

0

एएसपी.Net में सुविधाओं में से एक क्लाइंट-साइड कोड से क्लाइंट-साइड कोड से क्लाइंट कॉलबैक नामक किसी चीज़ का उपयोग करके कॉल करने की क्षमता है। मुझे अब तक मिली कुछ छोटी सी चेतावनियां मिली हैं: -

  • यह XmlHttp का उपयोग करता है जो इस समय केवल आईई है। फ़ायरफ़ॉक्स और अन्य ब्राउज़रों के पास एक विकल्प है, लेकिन कॉलबैक इसका उपयोग कर रहे हैं।
  • केवल प्रकार आप सर्वर से लौट सकते हैं एक स्ट्रिंग है (लेकिन हम उस के आसपास यदि आवश्यक हो तो serializing से प्राप्त कर सकते हैं)

उदाहरण मैं का उपयोग किया है वह जगह है जहाँ मैं दो संबंधित बक्सें होने की जरूरत है कि है सिंक में रखा गया। यदि क्लाइंट आईडी बॉक्स बदल दिया गया है, तो क्लाइंटनाम बॉक्स को उस क्लाइंट का नाम प्रदर्शित करना चाहिए जिसमें वह आईडी है, और इसके विपरीत।

public partial class WebForm1 : System.Web.UI.Page, ICallbackEventHandler 

इसके बाद, मैं अपने aspx.cs में Page_Load विधि में मेरी कॉलबैक तरीकों रजिस्टर: - -:

इस कार्यक्षमता का उपयोग कर, अपने सुनिश्चित प्रारंभ करने के लिए कोड-पीछे ICallbackEventHandler इंटरफ़ेस लागू करता

// Set up client callbacks. These allow client-side scripts to call 
// server-side functions and retrieve the results. Its a string-only 
// return I'm afraid, limited by the ICallbackEventHandler method signatures 

txtClientID.Attributes.Add("onchange", "GetClientNameById('id|' + this.value, 'id');"); 

string callBackClientID = Page.ClientScript.GetCallbackEventReference(this, "arg", "ClientNameCallback", "context", "ClientNameCallbackError", true); 

string clientIDfunction = "function GetClientNameById(arg,context) { " + callBackClientID + "; }"; 

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "GetClientNameById", clientIDfunction, true); 

txtClientName.Attributes.Add("onchange", "GetClientIdByName('name|' + this.value, 'name');"); 

string callBackClientName = Page.ClientScript.GetCallbackEventReference(this, "arg", "ClientIdCallback", "context", "ClientIdCallbackError", true); 

string clientNamefunction = "function GetClientIdByName(arg, context) { " + callBackClientName + "; }"; 

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "GetClientIdByName", clientNamefunction, true); 

यह सर्वर के साथ पेज फ़ंक्शंस को पंजीकृत करता है और क्लाइंट कॉलबैक विधियों तक उन्हें हुक करता है - ये कॉलबैक विधियां मूल प्लेसहोल्डर्स हैं जो कुछ भी नहीं करती हैं लेकिन सर्वर को अपनी स्ट्रिंग को वापस करने के लिए कहीं भी देती हैं। तो aspx पेज पर ही: -

<script type="text/javascript"> 

function ClientNameCallback(result, context) 

{ 

//sorry about the hardcoded element name... 

if(result != "") 

document.getElementById('ctl00_ContentPlaceHolder1_txtClientName').setAttribute('value',result); 

} 

function ClientIdCallback(result,context) 

{ 

//sorry about the hardcoded element name... 

if(result != "") 

document.getElementById('ctl00_ContentPlaceHolder1_txtClientID').setAttribute('value',result); 

} 

function ClientNameCallbackError(result, context) 

{ 

//Not sure what error is likely to arise at this point, but... 

alert('Error in client name callback function - please say that to eSolutions!'); 

} 

function ClientIdCallbackError(result, context) 

{ 

//Not sure what error is likely to arise at this point, but... 

alert('Error in client id callback function - please say that to eSolutions!'); 

} 

</script> 

अंत में, हम आवश्यक ICallbackEventHandler, जो सर्वर साइड प्रसंस्करण शामिल लागू हम करना चाहते: -

string ICallbackEventHandler.GetCallbackResult() 
{ 
    return callbackReturnValue; 
} 

void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument) 
{ 

// eventArgument should be in format field|value, 
// e.g., "id|30102" or "name|test client" 
// This is because of the "single string" limitations 
// of the callback interface 

if(eventArgument.StartsWith("name")) 
{ 
    //....do lookup to get the id based on the name, from an array or database, or whatever 
    callbackReturnValue = <string we want to pass back to client-side 
} 

else if(eventArgument.StartsWith("id")) 

आदि आदि

+0

मुझे यह देखना होगा कि क्या मुझे एंडी शैलम –

6

this answer की तरह, इसे स्वयं करने के लिए +1।

हालांकि, मैं दृढ़ता से सलाह आप ब्राउज़रों में मतभेद के लिए खाते की ग्राहक पक्ष पर jQuery की तरह एक पुस्तकालय का उपयोग करने चाहिए (और इस विशेष मामले में, वहाँ मतभेद हैं)। यह (या अन्य पुस्तकालय) एक सार तत्व प्रदान करेगा जो आप अपने कोड को सामान्य करने के लिए सभी वेब ब्राउज़र में उपयोग कर सकते हैं।

कहा जा रहा है कि, एएसपी.नेट में, आप यह देखने के लिए जांच सकते हैं कि कॉल एक पोस्ट बैक है, और यदि ऐसा है, तो बस आउटपुट स्ट्रीम में सामग्री लिखें।

हालांकि, मैं दृढ़ता से इसके खिलाफ अनुशंसा करता हूं। इसके बजाय, AJAX को कॉल पूरी तरह से किसी अन्य पृष्ठ पर होना चाहिए, क्योंकि यह एक अलग उद्देश्य प्रदान कर रहा है, एक अलग तरह की प्रतिक्रिया है, और इसलिए, इसका अपना यूआरएल योग्य है।

इसके अलावा, आपको ध्यान दें कि एक्सएमएल या जेएसओएन (जो कि अजाक्स कॉल के लिए सामान्य है, जेएसओएन अब बहुत प्रभावशाली है) के रूप में सामग्री लौटने पर, उपयुक्त माइम के जवाब की सामग्री प्रकार बदलने के लिए महत्वपूर्ण है एक्सएमएल के लिए टाइप करें ("टेक्स्ट/एक्सएमएल", जेएसओएन के लिए "एप्लिकेशन/जेसन")।

ध्यान दें कि एएसपी.नेट एमवीसी यह सब बहुत आसान बनाता है, और आप वेबफॉर्म मॉडल के बजाय इसका उपयोग करना चाहते हैं, क्योंकि इन परिदृश्यों में से कई को संभालने के लिए एमवीसी जमीन से बनाया गया है। यह आपको अजाक्स कॉल के रूप में कार्यक्षमता प्रदान करने वाले लोगों से पृष्ठ प्रतिपादन को संसाधित करने वाली विधियों को स्पष्ट रूप से अलग करने की अनुमति देता है (और यह केवल कई लाभों में से एक है)।

+0

द्वारा वर्णित अलग-अलग पृष्ठ के तरीके का उपयोग करने से बेहतर यह पसंद है, हां, मुझे यह समझने के बाद कि मैन्युअल रूप से इसे कैसे किया जाए और सभी आंतरिक कार्यों को समझें, मैं सबसे अधिक संभावना रखूंगा jQuery जैसी लाइब्रेरी पर जाएं। बहुत धन्यवाद। सामग्री-प्रकार की आवश्यकता को इंगित करने के लिए –

+0

+1 –

1

यदि मैं अपनी सोच में सही हूं, तो आप एक सामान्य HTTP अनुरोध के बीच हेडर X-Requested-With की जांच करके एक AJAX कॉल के बीच अंतर कर सकते हैं।

public void Page_Load(object sender, EventArgs e) 
{ 
    if (Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
    { 
     Response.Clear(); // dont want <html>.... etc stuff 
     Response.Write("Hi from AJAX!"); 
    } 
    else 
    { 
     // normal page stuff 
    } 
} 

फिर, अपनी js में, कुछ इस तरह (किसी भी वाक्यविन्यास त्रुटियों को माफ कृपया)

var req = new XmlHttpRequest(); 
req.open("GET","default.aspx",false); 
req.send(""); 
document.getElementById('some_div').innerHTML = req.responseXML; 
+0

हम्म .. दुर्भाग्य से मैं इसे काम करने में सक्षम नहीं था। मुझे कुछ और जांच करने की आवश्यकता होगी क्योंकि ऐसा करने का एक प्रभावी तरीका लगता है। बहुत धन्यवाद! –

+0

@Tomaszewski कौन सा हिस्सा काम नहीं कर रहा था? यदि आप सीएस कोड में ब्रेक पॉइंट फंस गए हैं तो सही कोड ब्लॉक फायरिंग था? – Kirschstein

+0

हाय, प्रतिक्रिया के लिए धन्यवाद। डिबगिंग करते समय, मेरे अनुरोध। हेडर में "एक्स-अनुरोधित-साथ" नामक कुंजी नहीं लगती है, जब तक कि मुझे कुछ याद नहीं आ रहा है। –

संबंधित मुद्दे