ASP.NETアプリの背後にあるクライアント側のJavascriptとC#コードの間でデータを渡す方法


21

ASP.NETアプリケーションの背後にあるクライアント側のJavaScriptコードとC#コードの間でデータを渡す最も効率的で標準的な方法を探しています。私はこれを達成するために以下の方法を使用しましたが、それらはすべてちょっとしたファッジを感じます。

JavaScriptからC#コードにデータを渡すには、非表示のASP変数を設定してポストバックをトリガーします。

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

これらの方法は私に役立って仕事をしてくれましたが、完全ではありません。クライアント側のJavaScriptとC#バックエンドコード間でデータを渡すより標準的な方法はありますか?

HtmlElementクラスを説明するこのような投稿を見てきました。これは私が検討すべきものですか?



サーバーとクライアント間でデータを渡すことの意味に依存します。ページがレンダリングされた時点でデータがわかっている場合は、スクリプトを追加してデータを作成するか、リテラルなどのバリエーションまたはその他のバリエーションを介してjsonを設定することは完全に合理的です。OTOH、ポストバックを実行せずにサーバーと対話するページを作成しようとしている場合、それはまったく別の問題です。間違いなくjsonを見てください。
マーフ

例えば。XMLファイルからデータを取得したボタンをクライアントから起動した場合。次に、C#のデータに対していくつかの計算が行われます。次に、完成した結果をかなりjavascriptのグラフィカルなディスプレイに表示したいと思います。これは、ポストバックが発生するまでクライアントが結果を知らない1つのポストバックです。
cwc1983

そのコメントから、サーバーですべての作業(load / process / return)を実行することができます。したがって、最初のインスタンスでは、まさにそれを行います。データをjsonとしてフォーマットし、ページをレンダリングするときにjsonを含めます(リテラルでこれが可能になります)。それが機能するようになったら、おそらくもっと非同期なことをしたいでしょう-しかし、それは同じjsonになります。
マーフ

皆さんありがとう。ここでアドバイスを読んで、さらに調査を行った後、やりたいことを達成するための新しい方法を見つけました。私が得ていた主な問題は、Ajaxの投稿を実行したときに、プログラムの場所を記憶するためのクライアント側コードを取得できなかったことです。Imは、JQuery $ Ajax.Postを使用して、セッションデータを保存しているクライアントに成功時のポストバックを提供します。
cwc1983

回答:


9

この例のように、JavaScriptから静的ページメソッドを簡単かつ簡単に呼び出すことができます。複数のページからメソッドを呼び出す必要がある場合は、Webサービスをセットアップし、同じ方法でJavascriptから呼び出すことができます。以下にも例を示します。

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

Javascriptコード

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

注:ページメソッドは静的である必要があります。アプリケーションが何をしようとしているかによって、これは問題になる可能性があります。ただし、情報がまったくセッションに基づいており、何らかの組み込み認証を使用している場合は、WebMethodデコレータにEnableSession属性を設定できます。これにより、HttpContext.Current.Userにアクセスできます。セッションなど


素晴らしい例、これはうまく機能し、私はそれを使用します。ありがとう!
マウジモ

3

jQueryをご覧になることをお勧めします。JQueryを使用して、サーバーにAJAXコールバックを行うことができます。サーバーは必要な形式でデータを返すことができます。JavaScriptで直接使用できるので、適切な形式はJSONです。

jQueryを使用してサーバーからjavascriptにデータを取得するには、次のフェッチでhttp://youserver.com/my/uriに非同期リクエストを作成し、提供された関数でサーバーからデータを受信します。

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

JavaScriptからサーバーへのデータ送信も同様に機能します。

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

ありがたいことに、これは素晴らしいことですが、具体的には、クライアントが何を表示するかを知る前にポストバックが行われる状況を指します。「結果」がC#を介して達成される場合、どのようにクライアントに「注入」しますか。
cwc1983

3

マイクロソフトは、UpdatePanelおそらく標準的な方法であるajaxを実行するコントロールを実装しています。私は個人的にそれを使用することはお勧めしませんが、JavaScriptを直接使用するときの豊富な機能セットとコントロールに近いところはありません。

これは私が個人的に行う方法です:

標準ページポストバックで使用するクライアント側の値の非表示フィールドを作成します(つまり、ユーザーが送信をクリックしたとき)

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

javascriptライブラリを使用してajaxのpost / getを実行し、JavaScriptを使用して応答に基づいてページを更新します

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

作業を行うためにrenderメソッドをオーバーライドする別の「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をお勧めします。jQuery は安定しており、豊富な機能セットを備えています。


8
私はかなり確信して人々のための地獄の中で特別な場所がありますよ誰がそのようなサーバー上の文字列の構築JavaScriptのスニペット
レイノス

1
@Raynos JavaScriptサーバー側の生成に問題はありません。
トムスクワイアーズ

2
サーバーに何かをさせたい場合は、(XHRを使用して)賢明なデータを持つ賢明なURIにHTTPリクエストを送信します。そこからHTTPサーバーはそれをどうするかを知るでしょう。
Raynos

サーバー側にJSを置かないでください。それはクライアントに行きます。名前クライアント側のコードをご覧ください。おっとキャップスロックキーがスタックしました。
snowYetis

3

JSONは、タスクを達成するためのベストプラクティスの方法です。この問題を「C#とJavaScript」の間の受け渡しと見なさないでください。この考え方は、元の投稿にあるようなコードの奇妙さをもたらします。

より一般的には、言語に依存しない方法でクライアントとサーバー間でオブジェクトを渡すだけです。JSONは広くサポートされており、読みやすいため、タスクに最適です。


2

サーバーサイドASPを必要としない入力タグを設定するには、次を使用できます:(またはフォームデータバインディングの場合は<%#%>)

html:

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

ASPコントロール:

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

ポストバックで値を取得する

Request.Form["RANDOM_VALUES"]

その、aspが非表示の入力を制御する場合、使用できます

Request.Form[RandomList.UniqueID]

Request.Formの適切な部分は、同じ「名前」属性を持つ複数のタグがある場合、CSVで結果を返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.