কোনও এএসপি.নেট অ্যাপের পিছনে ক্লায়েন্ট-পাশের জাভাস্ক্রিপ্ট এবং সি # কোডের মধ্যে ডেটা কীভাবে পাস করা উচিত?


21

আমি একটি এএসপি.এনইটি অ্যাপ্লিকেশনটির পিছনে ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট কোড এবং সি # কোডের মধ্যে ডেটা পাস করার সবচেয়ে দক্ষ / মানক উপায়ের সন্ধান করছি। এটি অর্জনের জন্য আমি নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করছি তবে তারা সকলেই কিছুটা ফ্যাদ অনুভব করে।

জাভাস্ক্রিপ্ট থেকে সি # কোডে ডেটা প্রেরণ করা হ'ল লুকানো এএসপি ভেরিয়েবলগুলি সেট করা এবং একটি পোস্টব্যাক ট্রিগার করে:

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

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

তারপরে সি # কোডে আমি তালিকাটি সংগ্রহ করি:

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

অন্যভাবে পিছনে ফিরে আমি প্রায়শই কোনও ফাংশন রেজিস্ট্রেশন করতে এবং স্ক্রিট ম্যানেজারটি ব্যবহার করে পৃষ্ঠা_লোডের সময় এটি ডেটা পাস করার জন্য:

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

বা আমি কোনও পোস্ট পিছনের আগে বা প্রারম্ভিককরণ বা প্রাক-রেন্ডারিং পর্যায়ে নিয়ন্ত্রণগুলিতে বৈশিষ্ট্যগুলি যুক্ত করেছি:

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

এই পদ্ধতিগুলি আমাকে ভালভাবে পরিবেশন করেছে এবং কাজটি করেছে, তবে এগুলি কেবল সম্পূর্ণ বলে মনে হয় না। ক্লায়েন্ট সাইড জাভাস্ক্রিপ্ট এবং সি # ব্যাক-এন্ড কোডের মধ্যে ডেটা পাস করার আরও মানক উপায় আছে কি?

আমি এই জাতীয় কিছু পোস্ট দেখেছি যা এইচটিএমএলএলমেন্ট শ্রেণীর বর্ণনা দেয়; এটা কি আমার কিছু দেখা উচিত?



এটি সার্ভার এবং ক্লায়েন্টের মধ্যে ডেটা পাস করার মাধ্যমে আপনি কী বোঝাতে চান তার উপর নির্ভর করে। যদি পৃষ্ঠায় রেন্ডার করা হয় সেই তথ্যটিতে ডেটাটি জানা থাকে তবে আপনার ডেটা তৈরির জন্য একটি স্ক্রিপ্ট যুক্ত করা বা আক্ষরিক বা অনুরূপ বা অন্যান্য প্রকরণের মাধ্যমে জেসনকে সেট করা পুরোপুরি যুক্তিসঙ্গত। যদি ওটিওএইচ, আপনি এমন কোনও পৃষ্ঠা চেষ্টা করার চেষ্টা করছেন যা কোনও পোস্টব্যাক না করেই সার্ভারের সাথে যোগাযোগ করে তবে এটি সম্পূর্ণ ভিন্ন সমস্যা। অবশ্যই জসন তাকান।
মারফ

উদাহরণ স্বরূপ. যদি আমি ক্লায়েন্টের কাছ থেকে একটি বোতাম চালু করি যা কোনও এক্সএমএল ফাইল থেকে কিছু ডেটা পেয়েছে। তারপরে সি # তে থাকা ডেটাতে কিছু গণনা করা হয়। তারপরে আমি চাই যে সমাপ্ত ফলাফলটি একটি সুন্দর জাভাস্ক্রিপ্ট গ্রাফিকাল ডিসপ্লেতে প্রদর্শিত হবে। এমন একটি পোস্টব্যাক যেখানে ক্লায়েন্ট পোস্টব্যাকটি উত্থাপিত না হওয়া অবধি ফলাফল জানে না ts
cwc1983

এই মন্তব্যটি থেকে আপনি এখনও সার্ভারে সমস্ত কাজ সম্পাদন করতে সক্ষম হচ্ছেন - লোড / প্রক্রিয়া / রিটার্ন - সুতরাং, প্রথম উদাহরণে, আমি ঠিক এটি করব। তথ্যটি জসন হিসাবে ফর্ম্যাট করুন, পৃষ্ঠাটি রেন্ডার করার সময় জসনকে অন্তর্ভুক্ত করুন (একটি আক্ষরিক আপনাকে এটি করতে দেবে)। আপনি যখন এটি কাজ করতে পারেন তখন সম্ভবত আরও কিছু অ্যাসিনক্রোনাস করতে চান - তবে এটি একই জসন হবে।
মার্ফ

সবাইকে ধন্যবাদ. এখানে পরামর্শটি পড়ার পরে এবং কিছু অতিরিক্ত গবেষণা করার পরে আমি কী করতে চাই তা অর্জনের একটি নতুন পদ্ধতি খুঁজে পেয়েছি। আমি যে প্রধান সমস্যাটি পাচ্ছিলাম তা হ'ল আমি যখন একটি আজাক্স পোস্ট করলাম তখন ক্লায়েন্টের পাশের কোডটি প্রোগ্রামটি কোথায় ছিল তা আমি মনে করতে পারি না। আমি এখন 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"));
}

দ্রষ্টব্য: পৃষ্ঠার পদ্ধতিগুলি অচল থাকতে হবে। অ্যাপ্লিকেশনটি কী চেষ্টা করছে তার উপর নির্ভর করে এটি আপনার জন্য সমস্যাযুক্ত হতে পারে। তবে, যদি তথ্যটি মোটেও সেশনের উপর ভিত্তি করে তৈরি হয় এবং আপনি কিছু প্রকারের অন্তর্নির্মিত প্রমাণীকরণ ব্যবহার করে থাকেন তবে আপনি ওয়েবম্যাথড ডিকোরিটারে একটি সক্ষমসেশন বৈশিষ্ট্য রাখতে পারেন এবং এটি আপনাকে HTTPContext.Current.User এ পাওয়ার অনুমতি দেবে, সেশন, ইত্যাদি


দুর্দান্ত উদাহরণ, এটি ভাল কাজ করে এবং আমি এটি ব্যবহার করব। ধন্যবাদ!
মৌসিমো

3

আমি jQuery এ একবার দেখার পরামর্শ দিই। জিক্যুরিটি সার্ভারে ফিরে এজেএক্স কলগুলি করতে ব্যবহার করা যেতে পারে, যা আপনার প্রয়োজন মতো ফর্ম্যাটে ডেটা দিতে পারে - একটি ভাল ফর্ম্যাট জেএসএন হতে পারে, যেহেতু এটি সরাসরি জাভাস্ক্রিপ্টে ব্যবহার করা যেতে পারে।

সার্ভার থেকে জাভাস্ক্রিপ্ট ব্যবহার করে ডেটা টানতে 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

3

মাইক্রোসফ্ট এজ্যাক্স করার জন্য UpdatePanelনিয়ন্ত্রণটি তৈরি করেছে যাতে এটি "স্ট্যান্ডার্ড" উপায়। যদিও আমি ব্যক্তিগতভাবে এটি ব্যবহারের পরামর্শ দেব না, এটি সরাসরি জাভাস্ক্রিপ্ট ব্যবহার করার সময় সমৃদ্ধ বৈশিষ্ট্য সেট এবং নিয়ন্ত্রণের কাছাকাছি নেই।

আমি ব্যক্তিগতভাবে এটি এইভাবে করি:

মানক পৃষ্ঠার পোস্টব্যাকে আপনি যে কোনও ক্লায়েন্টের সাইড মান ব্যবহার করতে চান তার জন্য গোপন ক্ষেত্রগুলি তৈরি করুন (উদাহরণস্বরূপ যখন ব্যবহারকারী হিট জমা দেয়)

<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;
    } });

কাজটি করার জন্য রেন্ডার পদ্ধতিটিকে ওভাররাইড করে এমন একটি বিভক্ত "আজাক্স" পৃষ্ঠা লিখুন।

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
@ রায়নো জাভাস্ক্রিপ্ট সার্ভারের পাশ তৈরির ক্ষেত্রে কোনও ভুল নেই।
টম স্কোয়ায়ার্স

2
আপনি যদি সার্ভারটি কিছু করতে চান তবে আপনি একটি HTTP অনুরোধটি (এক্সএইচআর ব্যবহার করে) বুদ্ধিমান ডেটা সহ একটি বুদ্ধিমান ইউআরআইতে প্রেরণ করুন। সেখান থেকে এইচটিটিপি সার্ভারে এটি কী করতে হবে তা জানতে পারবে।
রায়নস

সার্ভারের পাশে কোনও জেএস লাগাবেন না। এটি ক্লায়েন্টের দিকে যায় নাম ক্লায়েন্ট সাইড কোড। উফ ক্যাপস-লক কী আটকে গেল।
স্নোইটিস

3

জাসন হ'ল কার্য সম্পাদন করার সর্বোত্তম অনুশীলনের উপায় way "সি # এবং জাভাস্ক্রিপ্ট" এর মধ্যে দিয়ে যাওয়ার হিসাবে সমস্যার দিকে তাকান না। এই চিন্তাভাবনাটি কোড অদ্ভুততার দিকে পরিচালিত করে যেমন আপনার আসল পোস্টে কী আছে।

আরও সাধারণভাবে, এটি কেবল ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি ভাষা অজ্ঞাব্য ফ্যাশনে অবজেক্টগুলি পাস করছে। জাসন এই কাজের জন্য দুর্দান্ত কারণ এটি ব্যাপকভাবে সমর্থিত এবং সহজেই পড়া সহজ।


2

একটি ইনপুট ট্যাগ সেট করতে যাতে সার্ভারসাইড এসপির প্রয়োজন হয় না, আপনি ব্যবহার করতে পারেন: (অথবা <% #%> ফর্ম ডেটাবাইন্ডিংয়ের জন্য)

এইচটিএমএল:

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

এসপি নিয়ন্ত্রণ:

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

পোস্টব্যাকে মান পেতে

Request.Form["RANDOM_VALUES"]

যদি এটির, এসপি নিয়ন্ত্রণ লুকানো ইনপুট থাকে তবে আপনি ব্যবহার করতে পারেন

Request.Form[RandomList.UniqueID]

অনুরোধ সম্পর্কে পরিষ্কার পরিচ্ছন্ন অংশটি হল আপনার যদি একই "নাম" বৈশিষ্ট্য সহ একাধিক ট্যাগ থাকে তবে এটি ফলাফল সিএসভিতে ফিরিয়ে দেবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.