एक ASP.NET ऐप के पीछे क्लाइंट-साइड जावास्क्रिप्ट और C # कोड के बीच डेटा कैसे पास होना चाहिए?


21

मैं एक ASP.NET अनुप्रयोग के पीछे क्लाइंट-साइड जावास्क्रिप्ट कोड और C # कोड के बीच डेटा पास करने के सबसे कुशल / मानक तरीके की तलाश कर रहा हूं। मैं इसे प्राप्त करने के लिए निम्नलिखित विधियों का उपयोग कर रहा हूं, लेकिन वे सभी एक ठगना महसूस करते हैं।

जावास्क्रिप्ट से सी # कोड में डेटा पास करने के लिए छिपे हुए एएसपी चर को सेट करके और पोस्टबैक को ट्रिगर करना है:

<asp:HiddenField ID="RandomList" runat="server" />

function SetDataField(data) {
      document.getElementById('<%=RandomList.ClientID%>').value = data;
}

फिर C # कोड में मैं सूची एकत्र करता हूं:

protected void GetData(object sender, EventArgs e)
{
      var _list = RandomList.value;
}

किसी अन्य तरीके से वापस जाने के लिए मैं या तो ScriptManager का उपयोग किसी फ़ंक्शन को पंजीकृत करने और Page_Load के दौरान डेटा पास करने के लिए करता हूं:

ScriptManager.RegisterStartupScript(this.GetType(), "Set","get("Test();",true);

या मैं पोस्ट बैक से पहले या इनिशियलाइज़ेशन या प्री-रेंडरिंग चरणों के दौरान नियंत्रण करने के लिए विशेषताएँ जोड़ता हूँ:

Btn.Attributes.Add("onclick", "DisplayMessage("Hello");");

इन विधियों ने मुझे अच्छी तरह से सेवा दी है और काम करते हैं, लेकिन वे अभी पूरा महसूस नहीं करते हैं। क्या क्लाइंट साइड जावास्क्रिप्ट और सी # बैक-एंड कोड के बीच डेटा पारित करने का एक और मानक तरीका है?

मैंने कुछ पोस्ट इस तरह देखी हैं जो HtmlElement वर्ग का वर्णन करती हैं; यह कुछ है जिसे मुझे देखना चाहिए?



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

उदाहरण के लिए। अगर मैंने क्लाइंट से एक बटन लॉन्च किया है जो xml फ़ाइल से कुछ डेटा मिला है। फिर C # में डेटा पर कुछ गणना की जाती है। फिर मैं चाहता हूं कि एक सुंदर जावास्क्रिप्ट ग्राफिकल डिस्प्ले में प्रदर्शित होने वाला समाप्त परिणाम। एक पोस्टबैक है, जहां क्लाइंट को पोस्टबैक के उठने के बाद तक परिणाम नहीं पता है।
cwc1983

उस टिप्पणी से आप अभी भी सर्वर - लोड / प्रोसेस / रिटर्न - में सभी कार्य करने में सक्षम हैं, इसलिए, पहली बार में, मैं बस यही करूँगा। डेटा को json के रूप में फॉर्मेट करें, पेज को रेंडर करते समय json को शामिल करें (एक शाब्दिक आपको ऐसा करने देगा)। जब आपको वह काम करने के लिए मिलता है, तो आप कुछ अधिक अतुल्यकालिक करना चाहते हैं - लेकिन यह एक ही जसन होगा।
मर्फ़

सबको शुक्रीया। यहाँ सलाह पढ़ने और कुछ अतिरिक्त शोध करने के बाद मैंने जो हासिल करना चाहा उसे प्राप्त करने का एक नया तरीका खोज लिया है। मुख्य मुद्दा मुझे यह मिल रहा था कि जब मैंने एक अजाक्स पोस्ट का प्रदर्शन किया, तो मुझे यह याद रखने के लिए क्लाइंट साइड कोड नहीं मिल सका कि कार्यक्रम कहाँ था। Im अब JQuery $ Ajax.Post का उपयोग कर रहा है क्योंकि यह क्लाइंट सेविंग सेशन डेटा को सक्सेस पोस्ट पर देता है।
cwc1983

जवाबों:


9

आप इस उदाहरण में जावास्क्रिप्ट से बस और आसानी से स्थैतिक पेज विधि को कॉल कर सकते हैं । यदि आपको कई पृष्ठों से विधि को कॉल करने की आवश्यकता है, तो आप वेब सेवा को सेटअप कर सकते हैं और इसे उसी तरह से जावास्क्रिप्ट से कॉल कर सकते हैं। उदाहरण भी नीचे शामिल है।

.aspx कोड

<asp:ScriptManager ID="ScriptManager1" 
EnablePageMethods="true" 
EnablePartialRendering="true" runat="server" />

कोड के पीछे कोड

using System.Web.Services;

[WebMethod]
public static string MyMethod(string name)
{
    return "Hello " + name;
}

जावास्क्रिप्ट कोड

function test() {
    alert(PageMethods.MyMethod("Paul Hayman"));
}

नोट: पृष्ठ विधियाँ स्थिर होनी चाहिए। यह आपके लिए समस्याग्रस्त हो सकता है, यह इस बात पर निर्भर करता है कि आवेदन क्या करने की कोशिश कर रहा है। हालाँकि, यदि जानकारी सत्र पर आधारित है, और आप किसी तरह के अंतर्निहित प्रमाणीकरण का उपयोग कर रहे हैं, तो आप WebMethod डेकोरेटर पर एक EnableSession विशेषता डाल सकते हैं, और यह आपको HttpContext.Current.User पर प्राप्त करने की अनुमति देगा। सत्र, आदि।


महान उदाहरण, यह अच्छी तरह से काम करता है और मैं इसका उपयोग करूंगा। धन्यवाद!
मौसिमो

3

मैं jQuery पर एक नज़र रखने की सलाह देते हैं। AJAX को सर्वर पर वापस करने के लिए JQuery का उपयोग किया जा सकता है, जो आपको जिस भी प्रारूप में आवश्यक है, वापस डेटा कर सकता है - एक अच्छा प्रारूप JSON हो सकता है, क्योंकि इसका उपयोग सीधे जावास्क्रिप्ट में किया जा सकता है।

सर्वर से डेटा को jQuery का उपयोग करके जावास्क्रिप्ट से नीचे खींचने के लिए , निम्न भ्रूण http://youserver.com/my/uri के लिए एक अतुल्यकालिक अनुरोध करता है और सर्वर से डेटा को आपूर्ति किए गए फ़ंक्शन में प्राप्त करता है।

$.get("my/uri", 
    function(data) { 
       // client side logic using the data from the server
    })

जावास्क्रिप्ट से सर्वर पर डेटा भेजना इसी तरह काम करता है:

$.post("my/uri", { aValue : "put any data for the server here" }
    function(data) { 
       // client side logic using the data returned from the server
    })

धन्यवाद, यह बहुत अच्छा है, लेकिन विशेष रूप से उन परिस्थितियों का जिक्र करता है जहां ग्राहक को प्रदर्शित करने से पहले एक पोस्टबैक किया जाता है। यदि "परिणाम" सी # के माध्यम से प्राप्त किया जाता है तो मैं कैसे करता हूं "क्लाइंट को वापस" इंजेक्ट करें।
cwc1983 22

3

Microsoft ने UpdatePanelajax करने के लिए नियंत्रण को अनुमानित किया है ताकि यकीनन "मानक" तरीका हो। मैं व्यक्तिगत रूप से इसका उपयोग करने की सिफारिश नहीं करूंगा, हालांकि, यह अमीर सुविधा सेट के पास कहीं नहीं है और सीधे जावास्क्रिप्ट का उपयोग करते समय आपके पास नियंत्रण है।

यह वह तरीका है जो मैं व्यक्तिगत रूप से करता हूं:

किसी भी ग्राहक पक्ष मान के लिए छिपे हुए फ़ील्ड बनाएँ जो आप मानक पृष्ठ पोस्टबैक में उपयोग करना चाहते हैं (यानी जब उपयोगकर्ता सबमिट सबमिट करता है)

<asp:HiddenField ID="selectedProduct" runat="server" />

आप ग्राहक पक्ष का उपयोग करना चाहते हैं नियंत्रण रजिस्टर के पीछे कोड में।

    /* Register the controls we want to use client side */

    string js = "var productBox = document.getElementById('" + selectedProduct.ClientID + "'); ";
    js += "var macCodeBoxBE = document.getElementById('" + beMacCode.ClientID + "'); ";


    ClientScript.RegisterStartupScript(this.GetType(), "prodBox", js, true);

अपने अजाक्स पोस्ट को करने के लिए एक जावास्क्रिप्ट लाइब्रेरी * का उपयोग करें / फिर प्रतिक्रिया के आधार पर पृष्ठ को अपडेट करने के लिए जावास्क्रिप्ट का उपयोग करें

$.get("../ajax/BTBookAppointment.aspx?dsl=" + telNumberBox.value + "&date=" + requiredDate.value + "&timeslot=" + ddTimeslot.value, function (response, status, xhr) {

    if (response.indexOf("not available") > -1) {
        loaderImage.src = "../images/cross.png"
        output.innerHTML = response;
    } });

एक seprate "ajax" पेज लिखें जो काम करने के लिए रेंडर विधि को ओवरराइड करता है।

protected override void Render(HtmlTextWriter writer)
{
    if (string.IsNullOrEmpty(Request["mac"])) { return; }
    if (string.IsNullOrEmpty(Request["dsl"])) { return; }
    DataLayer.Checkers.BTmacCheckResponse rsp = DataLayer.Checkers.Foo.CheckMAC(Request["dsl"], Request["mac"]);

    writer.Write(rsp.Valid.ToString());
}

* से चुनने के लिए बहुत सारे पुस्तकालय हैं, आप अपना रोल भी कर सकते हैं। मैं jQuery पुनः प्राप्त करूंगा , इसका स्थिर और एक व्यापक फीचर सेट है।


8
मुझे पूरा यकीन है कि लोगों के लिए नरक में एक विशेष स्थान है जो स्ट्रिंग को सर्वर पर जावास्क्रिप्ट स्निपेट का निर्माण करते हैं जैसे
रेयनोस नोव

1
@Raynos जावास्क्रिप्ट सर्वर साइड जनरेट करने में कुछ भी गलत नहीं है।
टॉम स्क्वायर्स 13

2
यदि आप सर्वर को कुछ भी करना चाहते हैं, तो आप समझदार डेटा के साथ एक समझदार URI को HTTP अनुरोध (XHR का उपयोग करके) भेजते हैं। वहां से HTTP सर्वर को पता चल जाएगा कि इसके साथ क्या करना है।
रेयनोस

गंभीर पक्ष पर कुछ भी जेएस नहीं है। यह ग्राहक पर जाता है। नाम स्पष्ट ग्राहक कोड का उल्लेख करें। उफ़ कैप-लॉक की चाबी अटक गई।
स्नोयेटिस

3

JSON कार्य को पूरा करने का सबसे अच्छा अभ्यास तरीका है। समस्या को "सी # और जावास्क्रिप्ट" के बीच गुजरने के रूप में न देखें। इस तरह से सोचने से कोड विषमताएं होती हैं जैसे कि आपके पास मूल पोस्ट में क्या है।

अधिक आम तौर पर, यह क्लाइंट और सर्वर के बीच एक भाषा अज्ञेय फैशन में वस्तुओं को पारित कर रहा है। JSON कार्य के लिए बहुत अच्छा है क्योंकि यह व्यापक रूप से समर्थित है और पढ़ने में आसान है।


2

इनपुट टैग सेट करने के लिए जिसे सर्वराइड एस्प की जरूरत नहीं है, आप उपयोग कर सकते हैं: (या फॉर्म डेटाबाइंडिंग के लिए <% #%>)

एचटीएमएल:

<input type="hidden" value='<%= RandomValues %>' name="RANDOM_VALUES" />

एस्प नियंत्रण:

<asp:HiddenField ID="RandomList" runat="server" />

पोस्टबैक पर मान प्राप्त करने के लिए

Request.Form["RANDOM_VALUES"]

यदि इसका, एस्प कंट्रोल हिडन इनपुट, आप उपयोग कर सकते हैं

Request.Form[RandomList.UniqueID]

Request.Form के बारे में साफ हिस्सा यह है कि यदि आपके पास एक ही "नाम" विशेषता वाले कई टैग हैं, तो यह CSV में परिणाम देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.